Java GC Tutorials - Herong's Tutorial Examples - v1.12, by Herong Yang
"-Xlog:gc+ergo=trace" - Minor GC Report
This section provides examples of log messages generated from '--Xlog:gc+ergo=trace' that tells us what happened at each Parallel Minor GC.
From last tutorial, we learned that the "-Xlog:gc+ergo=debug" option generates adaptive heap size related log messages at the DEBUG level. If we lower it to the TRACE level, additional log messages will be generated to help us to learn more about how Minor GC is performed.
For example, if we run GarbageCollection2.java with the following JVM options, we can get enough log messages to figure what happened at each Minor GC:
herong> java -Xms400m -Xmx400m -XX:+UseParallelGC \ -Xlog:gc=debug,gc+heap=debug,gc+ergo=trace GarbageCollection2
Here is what happened at GC(0), a Minor GC:
... 74 402128896 298309936 103818960 [debug][gc,heap] GC(0) Heap before GC invocations=1 (full 0): PSYoungGen total 119296K, used 101385K [... -- 101385K bytes newly allocated in "eden" before GC [debug][gc,heap] GC(0) eden space 102400K, 99% used [... [debug][gc,heap] GC(0) from space 16896K, 0% used [... [debug][gc,heap] GC(0) to space 16896K, 0% used [... [debug][gc,heap] GC(0) ParOldGen total 273408K, used 0K [... [debug][gc,heap] GC(0) object space 273408K, 0% used [... [trace][gc,ergo] GC(0) AdaptiveSizePolicy::minor_collection_end: minor gc cost: 0.021436 average: 0.021436 minor pause: 11.664955 minor period 532.523284 -- Minor GC ended and application paused for about 11 ms. [trace][gc,ergo] GC(0) AdaptiveSizePolicy::update_averages: survived: 16711952 promoted: 18891040 overflow: false -- 16711952 bytes survived in "from" space -- 18891040 bytes promoted to Tenured generation -- Bytes removed: 101385K - 16711952 - 18891040 = 68215248 bytes -- Bytes in Tenured generation: 0 + 18891040 = 18891040 bytes = 18448K ... [info ][gc,heap] GC(0) PSYoungGen: 101385K->16320K(119296K) [info ][gc,heap] GC(0) ParOldGen: 0K->18448K(273408K) -- Young generation usage reduced. Old generation usage expanded. [info ][gc ] GC(0) Pause Young (Allocation Failure) 99M->33M(383M) 12.294ms [debug][gc,heap] GC(0) Heap after GC invocations=1 (full 0): PSYoungGen total 119296K, used 16320K [... [debug][gc,heap] GC(0) eden space 102400K, 0% used [... [debug][gc,heap] GC(0) from space 16896K, 96% used [... [debug][gc,heap] GC(0) to space 16896K, 0% used [... [debug][gc,heap] GC(0) ParOldGen total 273408K, used 18448K [... [debug][gc,heap] GC(0) object space 273408K, 6% used [...
Here is what happened at GC(1), a Minor GC:
... 172 402128896 261709136 140419760 [debug][gc,heap] GC(1) Heap before GC invocations=2 (full 0): PSYoungGen total 119296K, used 118680K [... -- 118680K bytes newly allocated in "eden" before GC [debug][gc,heap] GC(1) eden space 102400K, 99% used [... [debug][gc,heap] GC(1) from space 16896K, 96% used [... [debug][gc,heap] GC(1) to space 16896K, 0% used [... [debug][gc,heap] GC(1) ParOldGen total 273408K, used 18448K [... [debug][gc,heap] GC(1) object space 273408K, 6% used [... [trace][gc,ergo] GC(1) AdaptiveSizePolicy::minor_collection_end: minor gc cost: 0.371056 average: 0.196423 minor pause: 9.135286 minor period 15.484390 -- Minor GC ended and application paused for about 9 ms. [trace][gc,ergo] GC(1) AdaptiveSizePolicy::update_averages: survived: 16728352 promoted: 19931440 overflow: false -- 16728352 bytes survived in "from" space -- 19931440 bytes promoted to Tenured generation -- Bytes removed: 118680K - 16728352 - 19931440 = 84868528 bytes -- Bytes in Tenured generation: 18891040 + 19931440 = 38822480 bytes = 37912K [info ][gc,heap] GC(1) PSYoungGen: 118680K->16336K(119296K) [info ][gc,heap] GC(1) ParOldGen: 18448K->37912K(273408K) [info ][gc ] GC(1) Pause Young (Allocation Failure) 133M->52M(383M) 9.687ms -- Young generation usage reduced. Old generation usage expanded. [debug][gc,heap] GC(1) Heap after GC invocations=2 (full 0): PSYoungGen total 119296K, used 16336K [... [debug][gc,heap] GC(1) eden space 102400K, 0% used [... [debug][gc,heap] GC(1) from space 16896K, 96% used [... [debug][gc,heap] GC(1) to space 16896K, 0% used [... [debug][gc,heap] GC(1) ParOldGen total 273408K, used 37912K [... [debug][gc,heap] GC(1) object space 273408K, 13% used [...
Here is what happened at GC(15), a Full GC:
[debug][gc,heap] GC(15) Heap before GC invocations=16 (full 1): PSYoungGen total 119296K, used 16384K [... [debug][gc,heap] GC(15) eden space 102400K, 0% used [... [debug][gc,heap] GC(15) from space 16896K, 96% used [... [debug][gc,heap] GC(15) to space 16896K, 0% used [... [debug][gc,heap] GC(15) ParOldGen total 273408K, used 263105K [... [debug][gc,heap] GC(15) object space 273408K, 96% used [... [trace][gc,ergo] GC(15) psAdaptiveSizePolicy::major_collection_end: major gc cost: 0.018823 average: 0.018823 major pause: 15.877642 major period 827.628856 -- Major GC ended and application paused for about 15 ms. [debug][gc] GC(15) Shrinking ParOldGen from 273408K by 110080K to 163328K -- Old generation allocation shrank, decided by AdaptiveSizePolicy [info ][gc,heap] GC(15) PSYoungGen: 16384K->0K(119296K) [info ][gc,heap] GC(15) ParOldGen: 263105K->34622K(163328K) [info ][gc ] GC(15) Pause Full (Ergonomics) 272M->33M(276M) 24.506ms -- Young generation usage reduced. Old generation usage reduced. [debug][gc,heap] GC(15) Heap after GC invocations=16 (full 1): PSYoungGen total 119296K, used 0K [... [debug][gc,heap] GC(15) eden space 102400K, 0% used [... [debug][gc,heap] GC(15) from space 16896K, 0% used [... [debug][gc,heap] GC(15) to space 16896K, 0% used [... [debug][gc,heap] GC(15) ParOldGen total 163328K, used 34622K [... [debug][gc,heap] GC(15) object space 163328K, 21% used [...
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"
Parallel Collector GC Log Message Format
Log Message Types from Parallel Collector
"--Xlog:gc+task+time=debug" - Print GC Threads
"-XX:ParallelGCThreads" - # of Threads
Parallel Collector Stops Application for Minor/Major GC
PSYoungGen Collector Using Tenuring Age
Parallel Collector Changing NewRatio and SurvivorRatio
Parallel Collector Adaptive Size Policy
Adaptive Size Policy Log Messages
►"-Xlog:gc+ergo=trace" - Minor GC Report
Adaptive Size Policy Changed Survivor Space
Adaptive Size Policy Changed Eden Space
Adaptive Size Policy for Best Latency
Parallel Collector Stopped using Young Generation
Adaptive Size Policy for Best Throughput
Concurrent Mark-Sweep (CMS) Collector - "+XX:+UseConcMarkSweepGC"
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