diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index 1e63d56844c..fda97c4836e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -640,6 +640,10 @@ void ShenandoahConcurrentGC::op_reset() { } else { _generation->prepare_gc(); } + + if (heap->mode()->is_generational()) { + heap->old_generation()->card_scan()->mark_read_table_as_clean(); + } } class ShenandoahInitMarkUpdateRegionStateClosure : public ShenandoahHeapRegionClosure { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index 0f21775c58c..c941379d576 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -136,11 +136,15 @@ void ShenandoahDegenGC::op_degenerated() { heap->set_unload_classes(_generation->heuristics()->can_unload_classes() && (!heap->mode()->is_generational() || _generation->is_global())); - op_reset(); + if (heap->mode()->is_generational()) { + // Clean the read table before swapping it. The end goal here is to have a clean + // write table, and to have the read table updated with the previous write table. + heap->old_generation()->card_scan()->mark_read_table_as_clean(); - if (heap->mode()->is_generational() && _generation->is_young()) { - // Swap remembered sets for young - _generation->swap_card_tables(); + if (_generation->is_young()) { + // Swap remembered sets for young + _generation->swap_card_tables(); + } } case _degenerated_roots: @@ -178,6 +182,8 @@ void ShenandoahDegenGC::op_degenerated() { } } + op_reset(); + // STW mark op_mark(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp index 53e462d2d38..9a511de939c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp @@ -246,11 +246,6 @@ void ShenandoahGeneration::merge_write_table() { void ShenandoahGeneration::prepare_gc() { reset_mark_bitmap(); - - ShenandoahHeap* const heap = ShenandoahHeap::heap(); - if (heap->mode()->is_generational()) { - heap->old_generation()->card_scan()->mark_read_table_as_clean(); - } } void ShenandoahGeneration::parallel_heap_region_iterate_free(ShenandoahHeapRegionClosure* cl) {