--- old/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp 2019-05-13 10:47:17.902185279 -0400 +++ new/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.cpp 2019-05-13 10:47:17.578184682 -0400 @@ -164,6 +164,8 @@ ShenandoahRootProcessor* _rp; ShenandoahHeap* _heap; ShenandoahCsetCodeRootsIterator* _cset_coderoots; + ShenandoahStringDedupRoot _dedup_roots; + public: ShenandoahInitTraversalCollectionTask(ShenandoahRootProcessor* rp, ShenandoahCsetCodeRootsIterator* cset_coderoots) : AbstractGangTask("Shenandoah Init Traversal Collection"), @@ -191,18 +193,17 @@ ShenandoahMarkCLDClosure cld_cl(&roots_cl); MarkingCodeBlobClosure code_cl(&roots_cl, CodeBlobToOopClosure::FixRelocations); if (unload_classes) { - _rp->process_strong_roots(&roots_cl, &cld_cl, NULL, NULL, worker_id); + _rp->strong_roots_do(worker_id, &roots_cl); // Need to pre-evac code roots here. Otherwise we might see from-space constants. ShenandoahWorkerTimings* worker_times = _heap->phase_timings()->worker_times(); ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id); _cset_coderoots->possibly_parallel_blobs_do(&code_cl); } else { - _rp->process_all_roots(&roots_cl, &cld_cl, &code_cl, NULL, worker_id); - } - if (ShenandoahStringDedup::is_enabled()) { - AlwaysTrueClosure is_alive; - ShenandoahStringDedup::parallel_oops_do(&is_alive, &roots_cl, worker_id); + _rp->roots_do(worker_id, &roots_cl, &cld_cl, &code_cl); } + + AlwaysTrueClosure is_alive; + _dedup_roots.oops_do(&is_alive, &roots_cl, worker_id); } } }; @@ -273,23 +274,23 @@ // roots here. if (!_heap->is_degenerated_gc_in_progress()) { ShenandoahTraversalClosure roots_cl(q, rp); - CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); ShenandoahTraversalSATBThreadsClosure tc(&satb_cl); if (unload_classes) { ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl); - _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id); + _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl, NULL, &tc); } else { - _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id); + CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); + _rp->roots_do(worker_id, &roots_cl, &cld_cl, NULL, &tc); } } else { ShenandoahTraversalDegenClosure roots_cl(q, rp); - CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); ShenandoahTraversalSATBThreadsClosure tc(&satb_cl); if (unload_classes) { ShenandoahRemarkCLDClosure remark_cld_cl(&roots_cl); - _rp->process_strong_roots(&roots_cl, &remark_cld_cl, NULL, &tc, worker_id); + _rp->strong_roots_do(worker_id, &roots_cl, &remark_cld_cl, NULL, &tc); } else { - _rp->process_all_roots(&roots_cl, &cld_cl, NULL, &tc, worker_id); + CLDToOopClosure cld_cl(&roots_cl, ClassLoaderData::_claim_strong); + _rp->roots_do(worker_id, &roots_cl, &cld_cl, NULL, &tc); } } @@ -411,7 +412,7 @@ { uint nworkers = _heap->workers()->active_workers(); task_queues()->reserve(nworkers); - ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::init_traversal_gc_work); + ShenandoahRootProcessor rp(nworkers, ShenandoahPhaseTimings::init_traversal_gc_work); ShenandoahCsetCodeRootsIterator cset_coderoots = ShenandoahCodeRoots::cset_iterator(); @@ -589,7 +590,7 @@ task_queues()->reserve(nworkers); // Finish traversal - ShenandoahRootProcessor rp(_heap, nworkers, ShenandoahPhaseTimings::final_traversal_gc_work); + ShenandoahRootProcessor rp(nworkers, ShenandoahPhaseTimings::final_traversal_gc_work); ShenandoahTerminationTracker term(ShenandoahPhaseTimings::final_traversal_gc_termination); ShenandoahTaskTerminator terminator(nworkers, task_queues()); @@ -698,10 +699,10 @@ class ShenandoahTraversalFixRootsTask : public AbstractGangTask { private: - ShenandoahRootProcessor* _rp; + ShenandoahRootUpdater* _rp; public: - ShenandoahTraversalFixRootsTask(ShenandoahRootProcessor* rp) : + ShenandoahTraversalFixRootsTask(ShenandoahRootUpdater* rp) : AbstractGangTask("Shenandoah traversal fix roots"), _rp(rp) { assert(ShenandoahHeap::heap()->has_forwarded_objects(), "Must be"); @@ -710,9 +711,8 @@ void work(uint worker_id) { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahTraversalFixRootsClosure cl; - MarkingCodeBlobClosure blobsCl(&cl, CodeBlobToOopClosure::FixRelocations); - CLDToOopClosure cldCl(&cl, ClassLoaderData::_claim_strong); - _rp->update_all_roots(&cl, &cldCl, &blobsCl, NULL, worker_id); + ShenandoahForwardedIsAliveClosure is_alive; + _rp->roots_do(worker_id, &is_alive, &cl); } }; @@ -720,7 +720,7 @@ #if defined(COMPILER2) || INCLUDE_JVMCI DerivedPointerTable::clear(); #endif - ShenandoahRootProcessor rp(_heap, _heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots); + ShenandoahRootUpdater rp(_heap->workers()->active_workers(), ShenandoahPhaseTimings::final_traversal_update_roots, true /* update code cache */); ShenandoahTraversalFixRootsTask update_roots_task(&rp); _heap->workers()->run_task(&update_roots_task); #if defined(COMPILER2) || INCLUDE_JVMCI