RFR: 8338737: Shenandoah: Reset marking bitmaps after the cycle

Xiaolong Peng xpeng at openjdk.org
Fri Dec 20 07:58:10 UTC 2024


Reset marking bitmaps after collection cycle; for GenShen only do this for young generation, also choose not do this for Degen and full GC since both are running at safepoint, we should leave safepoint as ASAP.

I have run same workload for 30s with Shenandoah in generational mode and classic mode, average average time of concurrent reset dropped significantly since in most case bitmap for young gen should have been reset after pervious concurrent cycle finishes if there is no need to preserve bitmap states.

GenShen:
Before:

[33.342s][info][gc,stats    ] Concurrent Reset               =    0.023 s (a =     1921 us) (n =    12) (lvls, us =      133,      385,     1191,     1836,     8878)


After:

[33.597s][info][gc,stats    ] Concurrent Reset               =    0.004 s (a =      317 us) (n =    13) (lvls, us =       58,      119,      217,      410,      670)
[33.597s][info][gc,stats    ] Concurrent Reset After Collect =    0.018 s (a =     1365 us) (n =    13) (lvls, us =       91,      186,      818,     1836,     3872)


Shenandoah:
Before:

[33.144s][info][gc,stats    ] Concurrent Reset               =    0.014 s (a =     1067 us) (n =    13) (lvls, us =      139,      277,      898,     1328,     2118)

After:

[33.128s][info][gc,stats    ] Concurrent Reset               =    0.003 s (a =      225 us) (n =    13) (lvls, us =       32,       92,      137,      295,      542)
[33.128s][info][gc,stats    ] Concurrent Reset After Collect =    0.009 s (a =      661 us) (n =    13) (lvls, us =       92,      160,      594,      896,     1661)


Additional changes:
* Remove `ShenandoahResetBitmapClosure` and  `ShenandoahPrepareForMarkClosure`, merge the code with `ShenandoahResetBitmapClosure`, saving one iteration over all the regions. 
* Use API `ShenandoahGeneration::parallel_heap_region_iterate_free` to iterate the regions, two benefits from this:
-  Underneath it calls `ShenandoahHeap::parallel_heap_region_iterate`, which is faster for very light tasks, see https://bugs.openjdk.org/browse/JDK-8337154
-  `ShenandoahGeneration::parallel_heap_region_iterate_free` decorate the closure with `ShenandoahExcludeRegionClosure`, which simplifies the code in closure.
* When `_do_old_gc_bootstrap is true`, instead of reset mark bitmap for old gen separately, simply reset the global generations, so we don't need walk the all regions twice. 
* Clean up FullGC code, remove duplicate code.

Additional tests:
- [x] CONF=macosx-aarch64-server-fastdebug make test TEST=hotspot_gc_shenandoah

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

Commit messages:
 - Merge branch 'openjdk:master' into reset-bitmap
 - Remove ShenandoahResetUpdateRegionStateClosure
 - Always set_mark_incomplete when reset mark bitmap
 - Fix
 - Add comments
 - fix
 - Not reset_mark_bitmap after cycle when  is_concurrent_old_mark_in_progress or is_prepare_for_old_mark_in_progress
 - Not invoke set_mark_incomplete when reset bitmap after cycle
 - Renaming, comments, cleanup
 - Merge Concurrent reset (Old) into Concurrent reset
 - ... and 5 more: https://git.openjdk.org/jdk/compare/b2811a0c...2b9f28a1

Changes: https://git.openjdk.org/jdk/pull/22778/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=22778&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8338737
  Stats: 176 lines in 9 files changed: 93 ins; 62 del; 21 mod
  Patch: https://git.openjdk.org/jdk/pull/22778.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/22778/head:pull/22778

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


More information about the shenandoah-dev mailing list