OpenJDK Colleagues:

Please review this proposed integration of Generational mode for Shenandoah GC 
under https://bugs.openjdk.org/browse/JDK-8307314.

Generational mode of Shenandoah is enabled by adding 
`-XX:+UnlockExperimentalVMOptions -XX:ShenandoahGCMode=generational` to a 
command line that already specifies ` -XX:+UseShenandoahGC`.  The 
implementation automatically adjusts the sizes of old generation and young 
generation to efficiently utilize the entire heap capacity.  Generational mode 
of Shenandoah resembles G1 in the following regards:

1. Old-generation marking runs concurrently during the time that multiple young 
generation collections run to completion.
2. After old-generation marking completes, we perform a sequence of mixed 
collections.  Each mixed collection combines collection of young generation 
with evacuation of a portion of the old-generation regions identified for 
collection based on old-generation marking information.
3. Unlike G1, young-generation collections and evacuations are entirely 
concurrent, as with single-generation Shenandoah.
4. As with single-generation Shenandoah, there is no explicit notion of eden 
and survivor space within the young generation.  In practice, regions that were 
most recently allocated tend to have large amounts of garbage and these regions 
tend to be collected with very little effort.  Young-generation objects that 
survive garbage collection tend to accumulate in regions that hold survivor 
objects.  These regions tend to have smaller amounts of garbage, and are less 
likely to be collected.  If they survive a sufficient number of 
young-generation collections, the “survivor” regions are promoted into the old 
generation.

We expect to refine heuristics as we gain experience with more production 
workloads.  In the future, we plan to remove the “experimental” qualifier from 
generational mode, at which time we expect that generational mode will become 
the default mode for Shenandoah.

**Testing**: We continuously run jtreg tiers 1-4 + hotspot_gc_shenandoah, 
gcstress, jck compiler, jck runtime, Dacapo, SpecJBB, SpecVM, Extremem, 
HyperAlloc, and multiple AWS production workload simulators. We test on Linux 
x64 and aarch64, Alpine x64 and aarch64, macOS x64 and aarch64, and Windows x64.

-------------

Commit messages:
 - Revert changes to jcheck configuration
 - Remove early planning docs from PR
 - Merge remote-tracking branch 'shenandoah/master' into 
merge-generational-shenandoah
 - Expand old on demand
 - Merge openjdk/jdk:master
 - Make generational mode experimental
 - Merge openjdk/jdk:master
 - Improve mixed collection logging
 - Use soft max capacity only for trigger calculations
 - Use static assert to validate card offset encoding mask
 - ... and 281 more: https://git.openjdk.org/jdk/compare/ce5251af...aa85a907

Changes: https://git.openjdk.org/jdk/pull/14185/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=14185&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8307314
  Stats: 20150 lines in 205 files changed: 18237 ins; 904 del; 1009 mod
  Patch: https://git.openjdk.org/jdk/pull/14185.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/14185/head:pull/14185

PR: https://git.openjdk.org/jdk/pull/14185

Reply via email to