Java GC Tutorials - Herong's Tutorial Examples - v1.11, by Dr. Herong Yang
"-XX:CMSInitiatingOccupancyFraction=20" - Initiate CMS
This section demonstrates that the '-XX:+UseCMSInitiatingOccupancyOnly' and '-XX:CMSInitiatingOccupancyFraction=20' JVM options can initiate CMS collector when Tenured generation occupancy reaches 20%.
In the last tutorial, we saw that the CMS collector was triggered when memory usage in the Tenured generation reached 60%.
If we want to start the CMS collector earlier, we can use "-XX:+UseCMSInitiatingOccupancyOnly" and "-XX:CMSInitiatingOccupancyFraction=20" JVM options to use the given 20% Tenured generation occupancy only to initiate CMS collector:
herong> java -XX:+UseConcMarkSweepGC \ -Xms80m -Xmx80m -XX:NewRatio=3 -XX:SurvivorRatio=18 \ -XX:MaxTenuringThreshold=0 \ -XX:CMSInitiatingOccupancyFraction=20 \ -XX:+UseCMSInitiatingOccupancyOnly \ -Xlog:gc,gc+heap=debug,gc+age=trace \ GarbageCollection2 > output.txt herong> more output.txt ... 16 82837504 64172304 18665200 GC(0) ParNew: 18227K->0K(19456K) GC(0) CMS: 0K->13130K(61440K) GC(0) Pause Young (Allocation Failure) 17M->12M(79M) 10.905ms GC(1) Pause Initial Mark 13M->13M(79M) 0.328ms GC(1) Concurrent Mark -- GC #0 (Young GC) moved 13130K objects to Tenured generation -- Tenured generation occupancy reached: 13130K/61440K = 21% > 20% -- This triggered GC #1 (Old GC) as expected 32 82837504 52244608 30592896 GC(1) Concurrent Mark 2.207ms GC(1) Concurrent Preclean 33 82837504 51196016 31641488 GC(2) ParNew: 17769K->0K(19456K) GC(2) CMS: 13130K->25418K(61440K) GC(2) Pause Young (Allocation Failure) 30M->24M(79M) 6.030ms -- GC #2 (Young GC) performed while GC #1 (Old GC) was still running GC(1) Concurrent Sweep 35 82837504 54340368 28497136 36 82837504 53298320 29539184 GC(1) Concurrent Sweep 0.548ms 37 82837504 52235568 30601936 GC(1) Concurrent Reset 38 82837504 53298408 29539096 39 82837504 52249816 30587688 40 82837504 51201224 31636280 GC(1) Concurrent Reset 0.326ms GC(1) Old: 13130K->23364K(61440K) -- GC #1 (Old GC) - reached the end! ... 50 82837504 40715304 42122200 GC(3) ParNew: 17770K->0K(19456K) GC(3) CMS: 23364K->36676K(61440K) GC(3) Pause Young (Allocation Failure) 40M->35M(79M) 5.675ms GC(4) Pause Initial Mark 36M->36M(79M) 0.077ms GC(4) Concurrent Mark -- GC #3 (Young GC) moved more objects to Tenured generation -- Tenured generation occupancy reached: 36676K/61440K = 60% > 20% -- This triggered GC #4 (Old GC) as expected ... 61 82837504 33375656 49461848 GC(4) Concurrent Mark 1.417ms GC(4) Concurrent Preclean 62 82837504 32327064 50510440 GC(4) Concurrent Preclean 0.136ms GC(4) Concurrent Abortable Preclean -- GC #2 (Old GC) - continued concurrently GC(5) ParNew: 17770K->0K(19456K) GC(5) CMS: 36676K->46916K(61440K) GC(5) Pause Young (Allocation Failure) 53M->45M(79M) 5.194ms -- GC #5 (Young GC) performed while GC #4 (Old GC) was still running GC(4) Concurrent Abortable Preclean 16.344ms GC(7) Pause Full (Allocation Failure) 76M->28M(79M) 8.291ms GC(6) ParNew: 17954K->0K(19456K) GC(6) CMS: 46916K->29414K(61440K) GC(6) Pause Young (Allocation Failure) 63M->28M(79M) 16.381ms -- GC #4 (Old GC) was cancelled - Old generation was full -- GC #7 (Full GC) was performed -- GC #6 (Young GC) was also performed ...
Conclusion: "-XX:+UseCMSInitiatingOccupancyOnly" and "-XX:CMSInitiatingOccupancyFraction=20" JVM options can force CMS collector to initiate Tenured generation GC when Tenured generation occupancy reaches 20%.
Note that both "-XX:+UseCMSInitiatingOccupancyOnly" and "-XX:CMSInitiatingOccupancyFraction=20" JVM options must be used together.
Table of Contents
Heap Memory Area and Size Control
JVM Garbage Collection Logging
Introduction of Garbage Collectors
Serial Collector - "+XX:+UseSerialGC"
Parallel Collector - "+XX:+UseParallelGC"
►Concurrent Mark-Sweep (CMS) Collector - "+XX:+UseConcMarkSweepGC"
What Is Concurrent Mark-Sweep (CMS) Collector
Concurrent Mark-Sweep Collector GC Log Message Format
Reduce Stop-The-World with Concurrent Mark and Sweep
Parallel New (ParNew) Collector for Minor GC
ParNew Collector - Tenuring Age Distribution
Maximum Logging of All Phases on Young GC
"-XX:ParallelGCThreads=6" - Young GC Parallel Threads
"-XX:MaxTenuringThreshold=0" - Tenuring Objects Immediately
►"-XX:CMSInitiatingOccupancyFraction=20" - Initiate CMS
Maximum Logging of All Phases on Old GC
Maximum Logging of All Phases on Full GC
"-XX:ParallelGCThreads=6" - Old GC Parallel Threads
"-XX:ConcGCThreads=3" - Old GC Concurrent Threads
Garbage First (G1) Collector - "+XX:+UseG1GC"
The Z Garbage Collector (ZGC) - "+XX:+UseZGC"
Object References and Garbage Collection
Garbage Collection Performance Test Program
Performance Tests on Serial Collector
Performance Tests on Parallel collector
Performance Tests on Concurrent collector
Performance Tests on G1 collector