diff -r 0cc52a55fce4 -r 92e7d617897e src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Thu Oct 17 20:56:04 2019 +0200 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Thu Oct 17 20:56:11 2019 +0200 @@ -1493,31 +1493,36 @@ stop_concurrent_marking(); + // All allocations past TAMS are implicitly live, adjust the region data. + // Bitmaps/TAMS are swapped at this point, so we need to poll complete bitmap. { ShenandoahGCPhase phase(ShenandoahPhaseTimings::complete_liveness); - - // All allocations past TAMS are implicitly live, adjust the region data. - // Bitmaps/TAMS are swapped at this point, so we need to poll complete bitmap. ShenandoahCompleteLivenessClosure cl; parallel_heap_region_iterate(&cl); } + // Force the threads to reacquire their TLABs outside the collection set. + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::retire_tlabs); + make_parsable(true); + } + + // Trash the collection set left over from previous cycle, if any. + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::trash_cset); + trash_cset_regions(); + } + { - ShenandoahGCPhase prepare_evac(ShenandoahPhaseTimings::prepare_evac); - - make_parsable(true); - - trash_cset_regions(); - - { - ShenandoahHeapLocker locker(lock()); - _collection_set->clear(); - _free_set->clear(); - - heuristics()->choose_collection_set(_collection_set); - - _free_set->rebuild(); - } + ShenandoahGCPhase phase(ShenandoahPhaseTimings::prepare_evac); + + ShenandoahHeapLocker locker(lock()); + _collection_set->clear(); + _free_set->clear(); + + heuristics()->choose_collection_set(_collection_set); + + _free_set->rebuild(); } // If collection set has candidates, start evacuation. @@ -1580,7 +1585,10 @@ set_evacuation_in_progress(false); - retire_and_reset_gclabs(); + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_evac_retire_gclabs); + retire_and_reset_gclabs(); + } if (ShenandoahVerify) { verifier()->verify_after_evacuation(); @@ -2234,7 +2242,10 @@ set_evacuation_in_progress(false); - retire_and_reset_gclabs(); + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_update_refs_retire_gclabs); + retire_and_reset_gclabs(); + } if (ShenandoahVerify) { if (!is_degenerated_gc_in_progress()) { @@ -2244,15 +2255,20 @@ } set_update_refs_in_progress(true); - make_parsable(true); - for (uint i = 0; i < num_regions(); i++) { - ShenandoahHeapRegion* r = get_region(i); - r->set_concurrent_iteration_safe_limit(r->top()); + + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_update_refs_prepare); + + make_parsable(true); + for (uint i = 0; i < num_regions(); i++) { + ShenandoahHeapRegion* r = get_region(i); + r->set_concurrent_iteration_safe_limit(r->top()); + } + + // Reset iterator. + _update_refs_iterator.reset(); } - // Reset iterator. - _update_refs_iterator.reset(); - if (ShenandoahPacing) { pacer()->setup_for_updaterefs(); } @@ -2263,7 +2279,7 @@ // Check if there is left-over work, and finish it if (_update_refs_iterator.has_next()) { - ShenandoahGCPhase final_work(ShenandoahPhaseTimings::final_update_refs_finish_work); + ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_update_refs_finish_work); // Finish updating references where we left off. clear_cancelled_gc(); @@ -2292,9 +2308,11 @@ verifier()->verify_roots_in_to_space(); } - ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle); - - trash_cset_regions(); + { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_update_refs_trash_cset); + trash_cset_regions(); + } + set_has_forwarded_objects(false); set_update_refs_in_progress(false);