8223951: Shenandoah: Only need to update thread roots during final update refs

Reviewed-by: shade
This commit is contained in:
Zhengyu Gu 2019-05-17 11:47:06 -04:00
parent 72dc5721e0
commit 092bb9e108
3 changed files with 34 additions and 3 deletions

@ -304,6 +304,34 @@ void ShenandoahConcurrentMark::update_roots(ShenandoahPhaseTimings::Phase root_p
#endif
}
class ShenandoahUpdateThreadRootsTask : public AbstractGangTask {
private:
ShenandoahThreadRoots _thread_roots;
ShenandoahPhaseTimings::Phase _phase;
public:
ShenandoahUpdateThreadRootsTask(bool is_par, ShenandoahPhaseTimings::Phase phase) :
AbstractGangTask("Shenandoah Update Thread Roots"),
_thread_roots(is_par),
_phase(phase) {
ShenandoahHeap::heap()->phase_timings()->record_workers_start(_phase);
}
~ShenandoahUpdateThreadRootsTask() {
ShenandoahHeap::heap()->phase_timings()->record_workers_end(_phase);
}
void work(uint worker_id) {
ShenandoahUpdateRefsClosure cl;
_thread_roots.oops_do(&cl, NULL, worker_id);
}
};
void ShenandoahConcurrentMark::update_thread_roots(ShenandoahPhaseTimings::Phase root_phase) {
WorkGang* workers = _heap->workers();
bool is_par = workers->active_workers() > 1;
ShenandoahUpdateThreadRootsTask task(is_par, root_phase);
workers->run_task(&task);
}
void ShenandoahConcurrentMark::initialize(uint workers) {
_heap = ShenandoahHeap::heap();

@ -79,6 +79,7 @@ public:
void mark_roots(ShenandoahPhaseTimings::Phase root_phase);
void update_roots(ShenandoahPhaseTimings::Phase root_phase);
void update_thread_roots(ShenandoahPhaseTimings::Phase root_phase);
// ---------- Weak references
//

@ -2200,9 +2200,11 @@ void ShenandoahHeap::op_final_updaterefs() {
verifier()->verify_roots_no_forwarded_except(ShenandoahRootVerifier::ThreadRoots);
}
concurrent_mark()->update_roots(is_degenerated_gc_in_progress() ?
ShenandoahPhaseTimings::degen_gc_update_roots:
ShenandoahPhaseTimings::final_update_refs_roots);
if (is_degenerated_gc_in_progress()) {
concurrent_mark()->update_roots(ShenandoahPhaseTimings::degen_gc_update_roots);
} else {
concurrent_mark()->update_thread_roots(ShenandoahPhaseTimings::final_update_refs_roots);
}
ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle);