RFR: 8352185: Shenandoah: Invalid logic for remembered set verification
Xiaolong Peng
xpeng at openjdk.org
Tue Mar 18 22:18:44 UTC 2025
There are some scenarios in which GenShen may have improper remembered set verification logic:
1. Concurrent young cycles following a Full GC:
In the end of ShenandoahFullGC, it resets bitmaps for the entire heap w/o resetting marking context to be incomplete, but ShenandoahVerifier has code like below to get a complete old marking context for remembered set verification
ShenandoahVerifier
ShenandoahMarkingContext* ShenandoahVerifier::get_marking_context_for_old() {
shenandoah_assert_generations_reconciled();
if (_heap->old_generation()->is_mark_complete() || _heap->gc_generation()->is_global()) {
return _heap->complete_marking_context();
}
return nullptr;
}
For the concurrent young GC cycles after a full GC, the old marking context used for remembered set verification is stale, and may cause unexpected result.
2. For the impl of `ShenandoahVerifier::get_marking_context_for_old` mentioned above, it always return a marking context for global GC, but marking bitmaps is already reset before before init-mark, `ShenandoahVerifier::help_verify_region_rem_set` always skip verification in this case.
3. ShenandoahConcurrentGC always clean remembered set read table, but only swap read/write table when gc generation is young, this issue causes remembered set verification before init-mark to use a completely clean remembered set, but it is covered by issue 2.
### Test
- [x] `make test TEST=hotspot_gc_shenandoah`
-------------
Commit messages:
- Clean and rebuild rem-set in global gc
- Set mark incomplete after ShenandoahMCResetCompleteBitmapTask
- Only clean rem-set read table in young gc; not verify rem-set in concurrent global GC in generational mode
- Always swap card table in generational mode so the table can be properly rebuilt through marking.
- Initial works
Changes: https://git.openjdk.org/jdk/pull/24092/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=24092&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8352185
Stats: 42 lines in 4 files changed: 17 ins; 16 del; 9 mod
Patch: https://git.openjdk.org/jdk/pull/24092.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/24092/head:pull/24092
PR: https://git.openjdk.org/jdk/pull/24092
More information about the hotspot-gc-dev
mailing list