garbage collection tuning in the java hotspot virtual machine · along with tenuring threshold +...

64
Garbage Collection Tuning in the Java HotSpotVirtual Machine Tony Printezis, Charlie Hunt Sun Microsystems

Upload: others

Post on 10-Oct-2019

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

Garbage Collection Tuning in the Java HotSpot™ Virtual Machine

Tony Printezis, Charlie HuntSun Microsystems

Page 2: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

2

Trademarks and Abbreviations> Java™ Virtual Machine (JVM)> Java HotSpot™ Virtual Machine (HotSpot JVM)

Page 3: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

3

Who We Are> Tony Printezis

● GC Group / HotSpot JVM development team● Been working on the HotSpot JVM since 2006● 10+ years of GC experience

> Charlie Hunt● Java Platform Performance Engineering Group● Works with many Sun product teams and

customers● 10+ years of Java technology performance work

Page 4: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

4

And if you remember only one thing...

GC Tuning is an Art!

Page 5: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

5

GC Tuning is an Art> Unfortunately, we can't give you a flawless recipe

or a flowchart that will apply to all your GC tuning scenarios

> GC tuning involves a lot of common pattern recognition

> This pattern recognition requires experience● We have a lot of it. :-)

Page 6: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

6

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 7: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

7

GCs in the HotSpot JVM> Three available GCs:

● Serial GC● Parallel GC / Parallel Old GC● Concurrent Mark-Sweep GC (CMS)

Page 8: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

8

Heap Layout (same for all GCs)

Old Generation

Permanent Generation

Young Generation

Page 9: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

9

Young GenerationAllocation (new Object())

Survivor SpacesEden

Page 10: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

10

Old Generation

Promotion(survivors from the Young Generation)

Page 11: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

11

Permanent Generation

Allocation(only directly from the JVM)

Page 12: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

12

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 13: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

13

Your Dream GC> You would really like a GC that has

● Low GC overhead,● Low GC pause times, and● Good space efficiency

> Unfortunately, you'll have to pick two (any two!)

Page 14: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

14

Heap Sizing Tuning Advice

Supersize it!

Page 15: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

15

Heap Sizing Trade-Offs> Generally, the larger the heap space, the better

● For both young and old generation● Larger space: less frequent GCs, lower GC

overhead, objects more likely to become garbage

● Smaller space: faster GCs (not always! see later)> Sometimes max heap size is dictated by

available memory and/or max space the JVM can address● You have to find a good balance between young

and old generation size

Page 16: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

16

Generation Size Roles> Young Generation Size

● Dictates frequency of minor GCs● Dictates how many objects will be reclaimed in the

young generation● Along with tenuring threshold + survivor space size

tuning> Old Generation

● Should comfortably hold the application's steady-state live size

● Decrease the major GC frequency as much as possible

Page 17: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

17

Two Very Important Points> You should try to maximize the number of

objects reclaimed in the young generation● This is probably the most important piece of

advice when sizing a heap and/or tuning the young generation

> Your application's memory footprint should not exceed the available physical memory● This is probably the second most important piece

of advice when sizing a heap> The above apply to all our GCs

Page 18: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

18

Sizing Heap Spaces> -Xmx<size> : max heap size

● young generation + old generation> -Xms<size> : initial heap size

● young generation + old generation> -Xmn<size> : young generation size> Applications with emphasis on performance tend

to set -Xms and -Xmx to the same value> When -Xms != -Xmx, heap growth or shrinking

requires a Full GC

Page 19: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

19

Should -Xms == -Xmx?> Set -Xms to what you think would be your desired

heap size● It's expensive to grow the heap

> If memory allows, set -Xmx to something larger than -Xms “just in case”● Maybe the application is hit with more load● Maybe the DB gets larger over time

> In most occasions, it's better to do a Full GC and grow the heap than to get an OOM and crash

Page 20: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

20

Sizing Heap Spaces (ii)> -XX:PermSize=<size> : permanent generation

initial size> -XX:MaxPermSize=<size> : permanent

generation max size> Applications with emphasis on performance

almost always set -XX:PermSize and -XX:MaxPermSize to the same value● Growing or shrinking the permanent generation

requires a Full GC too> Unfortunately, the permanent generation

occupancy is hard to predict

Page 21: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

21

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 22: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

22

Young Generation Sizing> Eden size determines

● The frequency of minor GCs● Which objects will be reclaimed at age 0

● Newly-allocated objects in Eden start from age 0● Their age is incremented at every minor GC

> Increasing the size of the Eden will not always affect minor GC times● Remember: minor GC times are proportional to

the amount of objects they copy (i.e., the live objects), not the young generation size

Page 23: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

23

Young Object Survivor Ratio

Youngest OldestNew-Allocated Object Age

Survi

vor R

atio

0

Page 24: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

24

Young Object Survivor Ratio (ii)

Youngest OldestNew-Allocated Object Age

Survi

vor R

atio

0

Page 25: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

25

Young Object Survivor Ratio (iii)

Youngest OldestNew-Allocated Object Age

Survi

vor R

atio

0

Page 26: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

26

Sizing Heap Spaces (iii)> -XX:NewSize=<size> : initial young generation

size> -XX:MaxNewSize=<size> : max young generation

size> -XX:NewRatio=<ratio> : young generation to old

generation ratio> Applications with emphasis on performance tend

to use -Xmn to size the young generation since it combines the use of -XX:NewSize and -XX:MaxNewSize

Page 27: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

27

Tenuring> -XX:TargetSurvivorRatio=<percent>, e.g., 50

● How much of the survivor space should be filled● Typically leave extra space to deal with “spikes”

> -XX:InitialTenuringThreshold=<threshold> (PGC only)> -XX:MaxTenuringThreshold=<threshold>> -XX:+AlwaysTenure

● Never keep any objects in the survivor spaces> -XX:+NeverTenure

● Very bad idea!

Page 28: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

28

Tenuring Threshold Trade-Offs> Try to retain as many objects as possible in the

survivor spaces so that they can be reclaimed in the young generation● Less promotion into the old generation● Less frequent old GCs

> But also, try not to unnecessarily copy very long-lived objects between the survivors● Unnecessary overhead on minor GCs

> Not always easy to find the perfect balance● Generally: better copy more, than promote more

Page 29: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

29

Tenuring Distribution> Monitor tenuring distribution with

-XX:+PrintTenuringDistributionDesired survivor size 6684672 bytes, new threshold 8 (max 8)- age 1: 2315488 bytes, 2315488 total- age 2: 19528 bytes, 2335016 total- age 3: 96 bytes, 2335112 total- age 4: 32 bytes, 2335144 total

> Young generation seems well tuned here● We can even decrease the survivor space size

Page 30: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

30

Tenuring Distribution (ii)Desired survivor size 3342336 bytes, new threshold 1 (max 6)- age 1: 3956928 bytes, 3956928 total

> Survivor space too small!● Increase survivor space and/or eden size

Page 31: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

31

Tenuring Distribution (iii)Desired survivor size 3342336 bytes, new threshold 6 (max 6)- age 1: 2483440 bytes, 2483440 total- age 2: 501240 bytes, 2984680 total- age 3: 50016 bytes, 3034696 total- age 4: 49088 bytes, 3083784 total- age 5: 48616 bytes, 3132400 total- age 6: 50128 bytes, 3182528 total

> Might be able to do better● Either increase max tenuring threshold● Or even set max tenuring threshold to 2

● If ages > 6 still have around 50K of surviving bytes

Page 32: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

32

Stop-The-World Parallel GC Threads> The number of parallel GC threads is controlled

by -XX:ParallelGCThreads=<num>> Default value assumes only one JVM per system> Set the parallel GC thread number according to:

● Number of JVMs deployed on the system / processor set / zone

● CPU chip architecture● Multiple hardware threads per chip core, i.e.,

UltraSPARC T1 / T2

Page 33: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

33

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 34: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

34

Parallel GC Ergonomics> The Parallel GC has ergonomics

● i.e., auto-tuning> Ergonomics help in improving out-of-the-box GC

performance> To get maximum performance, most customers

we know do manual tuning

Page 35: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

35

Parallel GC Tuning Advice> Tune the young generation as described so far> Try to avoid / decrease the frequency of major

GCs> We know of customers who use the Parallel GC

in low-pause environments● Avoid Full GCs by avoiding / minimizing promotion● Maximize heap size

Page 36: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

36

NUMA> Non-Uniform Memory Access

● Applicable to most SPARC, Opteron, more recently Intel platforms

> -XX:+UseNUMA> Splits the young generation into partitions

● Each partition “belongs” to a CPU> Allocates new objects into the partition that

belongs to the allocating CPU> Big win for some applications

Page 37: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

37

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 38: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

38

CMS Tuning Advice> Tune the young generation as described so far> Need to be even more careful about avoiding

premature promotion● Originally we were using an +AlwaysTenure policy● We have since changed our mind :-)

> Promotion in CMS is expensive (free lists)> The more often promotion / reclamation happens,

the more likely fragmentation will settle in

Page 39: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

39

CMS Tuning Advice (ii)> We know customers who tune their applications

to do mostly minor GCs, even with CMS● CMS is used as a “safety net”, when applications

load exceeds what they have provisioned for● Schedule Full GCs at non-critical times (say, late

at night) to “tidy up” the heap and minimize fragmentation

Page 40: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

40

Fragmentation> Two types

● External fragmentation● No free chunk is large enough to satisfy an allocation

● Internal fragmentation● Allocator rounds up allocation requests● Free space wasted due to this rounding up

Page 41: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

41

Fragmentation (ii)> The bad news: you can never eliminate it!

● It has been proven> The good news: you can decrease its likelihood

● Decrease promotion into the CMS old generation● Be careful when coding

● Large objects of various sizes are the main cause> But, when is the heap fragmented anyway?

Page 42: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

42

Concurrent CMS GC Threads> Number of parallel CMS threads is controlled by

-XX:ParallelCMSThreads=<num>● Available in post 6 JVMs

> Trade-Off● CMS cycle duration vs.● Concurrent overhead during a CMS cycle

Page 43: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

43

Permanent Generation and CMS> To date, classes will not be unloaded by default

from the permanent generation when using CMS● Both -XX:+CMSClassUnloadingEnabled and -XX:

+PermGenSweepingEnabled need to be set to enable class unloading in CMS

● The 2nd switch is not needed in post 6u4 JVMs

Page 44: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

44

Setting CMS Initiating Threshold> Again, a tricky trade-off!> Starting a CMS cycle too early

● Frequent CMS cycles● High concurrent overhead

> Starting a CMS cycle too late● Chance of an evacuation failure / Full GC

> Initiating heap occupancy should be (much) higher than the application steady-state live size

> Otherwise, CMS will constantly do CMS cycles

Page 45: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

45

Common CMS Scenarios> Applications that promote non-trivial amounts of

objects to the old generation● Old generation grows at a non-trivial rate● Very frequent CMS cycles● CMS cycles need to start relatively early

> Applications that promote very few or even no objects to the old generation● Old generation grows very slowly, if at all● Very infrequent CMS cycles● CMS cycles can start quite late

Page 46: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

46

Initiating CMS Cycles> CMS will try to automatically find the best

initiating occupancy● It first does a CMS cycle early to collect stats● Then, it tries to start cycles as late as possible,

but early enough not to run out of heap before the cycle completes

● It keeps collecting stats and adjusting when to start cycles

● Sometimes, the second cycle starts too late

Page 47: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

47

Initiating CMS Cycles (ii)> -XX:CMSInitiatingOccupancyFraction=<percent>

● Occupancy percentage of CMS old generation that triggers a CMS cycle

> -XX:+UseCMSInitiatingOccupancyOnly● Don't use the ergonomic initiating occupancy

Page 48: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

48

Initiating CMS Cycles (iii)> -XX:CMSInitiatingPermOccupancyFraction=<percent>

● Occupancy percentage of permanent generation that triggers a CMS cycle

● Class unloading must be enabled

Page 49: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

49

CMS Cycle Initiation Example> Cycle started too early:

[ParNew 390868K->296358K(773376K), 0.1882258 secs] [CMS-initial-mark 298458K(773376K), 0.0847541 secs] [ParNew 401318K->306863K(773376K), 0.1933159 secs] [CMS-concurrent-mark: 0.787/0.981 secs] [CMS-concurrent-preclean: 0.149/0.152 secs] [CMS-concurrent-abortable-preclean: 0.105/0.183 secs] [CMS-remark 374049K(773376K), 0.0353394 secs] [ParNew 407285K->312829K(773376K), 0.1969370 secs] [ParNew 405554K->311100K(773376K), 0.1922082 secs] [ParNew 404913K->310361K(773376K), 0.1909849 secs] [ParNew 406005K->311878K(773376K), 0.2012884 secs] [CMS-concurrent-sweep: 2.179/2.963 secs] [CMS-concurrent-reset: 0.010/0.010 secs] [ParNew 387767K->292925K(773376K), 0.1843175 secs] [CMS-initial-mark 295026K(773376K), 0.0865858 secs] [ParNew 397885K->303822K(773376K), 0.1995878 secs]

Page 50: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

50

CMS Cycle Initiation Example (ii)> Cycle started too late:

[ParNew 742993K->648506K(773376K), 0.1688876 secs] [ParNew 753466K->659042K(773376K), 0.1695921 secs] [CMS-initial-mark 661142K(773376K), 0.0861029 secs] [Full GC 645986K->234335K(655360K), 8.9112629 secs] [ParNew 339295K->247490K(773376K), 0.0230993 secs] [ParNew 352450K->259959K(773376K), 0.1933945 secs]

Page 51: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

51

CMS Cycle Initiation Example (iii)> This is better:

[ParNew 640710K->546360K(773376K), 0.1839508 secs] [CMS-initial-mark 548460K(773376K), 0.0883685 secs] [ParNew 651320K->556690K(773376K), 0.2052309 secs] [CMS-concurrent-mark: 0.832/1.038 secs] [CMS-concurrent-preclean: 0.146/0.151 secs] [CMS-concurrent-abortable-preclean: 0.181/0.181 secs] [CMS-remark 623877K(773376K), 0.0328863 secs] [ParNew 655656K->561336K(773376K), 0.2088224 secs] [ParNew 648882K->554390K(773376K), 0.2053158 secs] ...[ParNew 489586K->395012K(773376K), 0.2050494 secs] [ParNew 463096K->368901K(773376K), 0.2137257 secs] [CMS-concurrent-sweep: 4.873/6.745 secs] [CMS-concurrent-reset: 0.010/0.010 secs] [ParNew 445124K->350518K(773376K), 0.1800791 secs] [ParNew 455478K->361141K(773376K), 0.1849950 secs]

Page 52: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

52

Start CMS Cycles Explicitly> If relying on explicit GCs and want them to be

concurrent, use:● -XX:+ExplicitGCInvokesConcurrent

● Requires a post 6 JVM● -XX:+ExplicitGCInvokesConcurrentAndUnloadClasses

● Requires a post 6u4 JVM> Useful when wanting to cause references /

finalizers to be processed

Page 53: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

53

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 54: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

54

Monitoring the GC> Online

● VisualVM: http://visualvm.dev.java.net/● VisualGC:

● http://java.sun.com/performance/jvmstat/● VisualGC is also available as a VisualVM plug-in● Can monitor multiple JVMs within the same tool

> Offline● GC Logging● PrintGCStats● GChisto

Page 55: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

55

GC Logging in Production> Don't be afraid to enable GC logging in

production● Very helpful when diagnosing production issues

> Extremely low / non-existent overhead● Maybe some large files in your file system. :-)● We are surprised that customers are still afraid to

enable it> Real customer quote:

● “If someone doesn't enable GC logging in production, I shoot them!”

Page 56: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

56

Most Important GC Logging Parameters> You need at least:

● -XX:+PrintGCTimeStamps● Add -XX:+PrintGCDateStamps if you must

● -XX:+PrintGCDetails● Preferred over -verbosegc as it's more detailed

> Also useful:● -Xloggc:<file>● Separates GC logging output from application

output

Page 57: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

57

PrintGCStats> Summarizes GC logs> Downloadable script from

● http://java.sun.com/developer/technicalArticles/Programming/turbo/PrintGCStats.zip

> Usage● PrintGCStats -v cpus=<num> <gc log file>

● Where <num> is the number of CPUs on the machine where the GC log was obtained

> It might not work with some of the printing flags

Page 58: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

58

PrintGCStats Parallel GCwhat count total mean max stddevgen0t(s) 193 11.470 0.05943 0.687 0.0633gen1t(s) 1 7.350 7.34973 7.350 0.0000GC(s) 194 18.819 0.09701 7.350 0.5272alloc(MB) 193 11244.609 58.26222 100.875 18.8519promo(MB) 193 807.236 4.18257 96.426 9.9291used0(MB) 193 16018.930 82.99964 114.375 17.4899used1(MB) 1 635.896 635.89648 635.896 0.0000used(MB) 194 91802.213 473.20728 736.490 87.8376commit0(MB) 193 17854.188 92.50874 114.500 9.8209commit1(MB) 193 123520.000 640.00000 640.000 0.0000commit(MB) 193 141374.188 732.50874 754.500 9.8209alloc/elapsed_time = 11244.609 MB / 77.237 s = 145.586 MB/salloc/tot_cpu_time = 11244.609 MB / 1235.792 s = 9.099 MB/salloc/mut_cpu_time = 11244.609 MB / 934.682 s = 12.030 MB/spromo/elapsed_time = 807.236 MB / 77.237 s = 10.451 MB/spromo/gc0_time = 807.236 MB / 11.470 s = 70.380 MB/sgc_seq_load = 301.110 s / 1235.792 s = 24.366%gc_conc_load = 0.000 s / 1235.792 s = 0.000%gc_tot_load = 301.110 s / 1235.792 s = 24.366%

Page 59: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

59

PrintGCStats CMSwhat count total mean max stddevgen0(s) 110 24.381 0.22164 1.751 0.2038gen0t(s) 110 24.397 0.22179 1.751 0.2038cmsIM(s) 3 0.285 0.09494 0.108 0.0112cmsRM(s) 3 0.092 0.03074 0.032 0.0015GC(s) 113 24.774 0.21924 1.751 0.2013cmsCM(s) 3 2.459 0.81967 0.835 0.0146cmsCP(s) 6 0.971 0.16183 0.191 0.0272cmsCS(s) 3 14.620 4.87333 4.916 0.0638cmsCR(s) 3 0.036 0.01200 0.016 0.0035alloc(MB) 110 11275.000 102.50000 102.500 0.0000promo(MB) 110 1322.718 12.02471 104.608 11.8770used0(MB) 110 12664.750 115.13409 115.250 1.2157used(MB) 110 56546.542 514.05947 640.625 91.5858commit0(MB) 110 12677.500 115.25000 115.250 0.0000commit1(MB) 110 70400.000 640.00000 640.000 0.0000commit(MB) 110 83077.500 755.25000 755.250 0.0000alloc/elapsed_time = 11275.000 MB / 83.621 s = 134.835 MB/salloc/tot_cpu_time = 11275.000 MB / 1337.936 s = 8.427 MB/salloc/mut_cpu_time = 11275.000 MB / 923.472 s = 12.209 MB/spromo/elapsed_time = 1322.718 MB / 83.621 s = 15.818 MB/spromo/gc0_time = 1322.718 MB / 24.397 s = 54.217 MB/sgc_seq_load = 396.378 s / 1337.936 s = 29.626%gc_conc_load = 18.086 s / 1337.936 s = 1.352%gc_tot_load = 414.464 s / 1337.936 s = 30.978%

Page 60: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

60

GChisto> Graphical GC log visualizer> Under development

● Currently, can only show pause times> Open source at

● http://gchisto.dev.java.net/> It might not work with some of the printing flags

Page 61: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

61

Demo

GChisto Demo

Page 62: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

62

Agenda> Introductions> Brief GC Overview> GC Tuning

● Tuning the young generation● Tuning Parallel GC● Tuning CMS

> Monitoring the GC> Conclusions

Page 63: Garbage Collection Tuning in the Java HotSpot Virtual Machine · Along with tenuring threshold + survivor space size tuning > Old Generation Should comfortably hold the application's

63

Conclusions> Remember: GC tuning is an art> The talk contained

● Basic GC tuning concepts● How to monitor GCs● What to look out for● Examples of good tuning practices

> ...and practice makes perfect!