Java GC Tutorials - Herong's Tutorial Examples - v1.12, by Herong Yang
Adaptive Size Policy Changed Survivor Space
This section provides a tutorial on how Adaptive Size Policy used by the Parallel collector changed the survivor space in the Young generation.
In GC log example presented in the last tutorial, the Adaptive Size Policy of the Parallel collector suggested to keep Young generation size as is.
In this tutorial, we will look at GC log example from the test that suggests to change the survivor space size:
herong> java -Xms1200m -Xmx1200m -XX:NewRatio=1 -XX:SurvivorRatio=1 \ -XX:+UseParallelGC -Xlog:gc=debug,gc+heap=debug,gc_ergo=trace \ GarbageCollection2 ... 1461 1205862400 854657656 351204744 [debug][gc,heap] GC(4) Heap before GC invocations=5 (full 0): PSYoungGen total 358400K, used 342933K [... [debug][gc,heap] GC(4) eden space 307200K, 99% used [... [debug][gc,heap] GC(4) from space 51200K, 69% used [... [debug][gc,heap] GC(4) to space 51200K, 0% used [... [debug][gc,heap] GC(4) ParOldGen total 819200K, used 40K [... [debug][gc,heap] GC(4) object space 819200K, 0% used [... [trace][gc,ergo] GC(4) AdaptiveSizePolicy::minor_collection_end: minor gc cost: 0.231551 average: 0.179291 [trace][gc,ergo] GC(4) minor pause: 7.582323 minor period 25.163547 [trace][gc,ergo] GC(4) AdaptiveSizePolicy::update_averages: survived: 36635168 promoted: 0 overflow: false [debug][gc,ergo] GC(4) AdaptiveSizeStart: collection: 5 [trace][gc,ergo] GC(4) old_gen_capacity: 838860800 young_gen_capacity: 367001600 [trace][gc,ergo] GC(4) avg_survived: 36638520.000000 avg_deviation: 11309.248047 [debug][gc,ergo] GC(4) avg_survived_padded_avg: 36672448.000000 [trace][gc,ergo] GC(4) avg_promoted_avg: 8200.192383 avg_promoted_dev: 2222.899414 [debug][gc,ergo] GC(4) avg_promoted_padded_avg: 14868.890625 avg_pretenured_padded_avg: 0.000000 tenuring_thresh: 6 target_size: 36700160 -- Suggested to set tenuring threshold to 6 -- Suggested to set survivor space to 36700160 [trace][gc,ergo] GC(4) PSAdaptiveSizePolicy::adjust_eden_for_throughput (is_full: 0, cur_eden: 314572800): mutator_cost 0.820709 major_gc_cost 0.000000 minor_gc_cost 0.179291 [trace][gc,ergo] GC(4) Scaled eden increment: 314572800 by 1.000000 down to 314572800 [trace][gc,ergo] GC(4) Adjusting eden for throughput (avg 0.820709 goal 0.990000). desired_eden_size 629145600 eden delta 314572800 [debug][gc,ergo] GC(4) PSAdaptiveSizePolicy::compute_eden_space_size limits: desired_eden_size: 629145600 old_eden_size: 314572800 eden_limit: 314572800 cur_eden: 314572800 max_eden_size: 314572800 avg_young_live: 36638520 [debug][gc,ergo] GC(4) PSAdaptiveSizePolicy::compute_eden_space_size: costs minor_time: 0.179291 major_cost: 0.000000 mutator_cost: 0.820709 throughput_goal: 0.990000 [trace][gc,ergo] GC(4) Minor_pause: 0.010463 major_pause: 0.000000 minor_interval: 0.163884 major_interval: 0.000000 pause_goal: 18446744073709552.000000 [debug][gc,ergo] GC(4) Live_space: 305073984 free_space: 629145600 [trace][gc,ergo] GC(4) Base_footprint: 268435456 avg_young_live: 36638520 avg_old_live: 0 [debug][gc,ergo] GC(4) Old eden_size: 314572800 desired_eden_size: 314572800 [trace][gc,ergo] GC(4) PSAdaptiveSizePolicy::check_gc_overhead_limit: promo_limit: 838860800 max_eden_size: 314572800 total_free_limit: 1153433600 max_old_gen_size: 838860800 max_eden_size: 314572800 mem_free_limit: 23068672
[trace][gc,ergo] GC(4) PSYoungGen::resize_spaces( requested_eden_size: 314572800, requested_survivor_size: 36700160) [trace][gc,ergo] GC(4) eden: [0xe7000000..0x0f9c00000) 314572800 [trace][gc,ergo] GC(4) from: [0xf9c00000..0x0fce00000) 52428800 [trace][gc,ergo] GC(4) to: [0xfce00000..0x100000000) 52428800 [trace][gc,ergo] GC(4) Eden, from, to: [trace][gc,ergo] GC(4) [eden_start .. eden_end): [0xe7000000 .. 0x0f9c00000) 314572800 [trace][gc,ergo] GC(4) [from_start .. from_end): [0xf9c00000 .. 0x0fce00000) 52428800 [trace][gc,ergo] GC(4) [ to_start .. to_end): [0xfdd00000 .. 0x100000000) 36700160 -- Reduced survivor "to" space from 52428800 to 36700160 [trace][gc,ergo] GC(4) AdaptiveSizePolicy::survivor space sizes: collection: 5 (52428800, 52428800) -> (52428800, 36700160) -- Confirmed survivor space size changes [trace][gc,ergo] GC(4) Young generation size: desired eden: 314572800 survivor: 36700160 used: 36635168 capacity: 367001600 gen limits: 419430400 / 419430400 [debug][gc,ergo] GC(4) AdaptiveSizeStop: collection: 5 [info ][gc,heap] GC(4) PSYoungGen: 342933K->35776K(358400K) [info ][gc,heap] GC(4) ParOldGen: 40K->40K(819200K) [info ][gc ] GC(4) Pause Young (Allocation Failure) 334M->34M(1150M) 7.942ms [debug][gc,heap] GC(4) Heap after GC invocations=5 (full 0): PSYoungGen total 358400K, used 35776K [... [debug][gc,heap] GC(4) eden space 307200K, 0% used [... [debug][gc,heap] GC(4) from space 51200K, 69% used [... [debug][gc,heap] GC(4) to space 35840K, 0% used [... [debug][gc,heap] GC(4) ParOldGen total 819200K, used 40K [... [debug][gc,heap] GC(4) object space 819200K, 0% used [... PSAdaptiveSizePolicy::compute_eden_space_size limits: desired_eden_size: 419430400 old_eden_size: 209715200 eden_limit: 209715200 cur_eden: 209715200 max_eden_size: 209715200 avg_young_live: 18728788 -- Suggested to increase "eden" to 419430400
As you can see, the "to" survivor space was decreased from 51200K to 35840K based on the Adaptive Size Policy suggestion. May be it is trying to lower the Minor GC time and increase Major GC time.
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