8223951: Shenandoah: Only need to update thread roots during final update refs
Reviewed-by: shade
This commit is contained in:
parent
72dc5721e0
commit
092bb9e108
src/hotspot/share/gc/shenandoah
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user