# HG changeset patch # User zgu # Date 1561394357 14400 # Mon Jun 24 12:39:17 2019 -0400 # Node ID 61dbcd5dd22b94ed4253a75d6907c018395fa775 # Parent aee0d296c0ef2aed262890e14a331bcf6d19c33a 8226310: Shenandoah: Concurrent evacuation of CLDG diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -1524,6 +1524,7 @@ if (ShenandoahVerify) { if (ShenandoahConcurrentRoots::should_do_concurrent_roots()) { ShenandoahRootVerifier::RootTypes types = ShenandoahRootVerifier::combine(ShenandoahRootVerifier::JNIHandleRoots, ShenandoahRootVerifier::WeakRoots); + types = ShenandoahRootVerifier::combine(types, ShenandoahRootVerifier::CLDGRoots); verifier()->verify_roots_no_forwarded_except(types); } else { verifier()->verify_roots_no_forwarded(); @@ -1592,6 +1593,7 @@ private: ShenandoahJNIHandleRoots _jni_roots; ShenandoahWeakRoots _weak_roots; + ShenandoahClassLoaderDataRoots _cld_roots; public: ShenandoahConcurrentRootsEvacUpdateTask() : @@ -1601,8 +1603,10 @@ void work(uint worker_id) { ShenandoahEvacOOMScope oom; ShenandoahEvacuateUpdateRootsClosure cl; + CLDToOopClosure clds(&cl, ClassLoaderData::_claim_strong); _jni_roots.oops_do(&cl); + _cld_roots.cld_do(&clds); _weak_roots.oops_do(&cl); } }; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp @@ -162,18 +162,18 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) { MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations); - CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id); if (_include_concurrent_roots) { + CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); _jni_roots.oops_do(oops, worker_id); + _cld_roots.cld_do(&clds, worker_id); _weak_roots.oops_do(oops, worker_id); } _thread_roots.oops_do(oops, NULL, worker_id); - _cld_roots.cld_do(&clds, worker_id); _code_roots.code_blobs_do(&blobsCl, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp @@ -190,13 +190,14 @@ void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id); }; -template +template class ShenandoahClassLoaderDataRoots { public: ShenandoahClassLoaderDataRoots(); + ~ShenandoahClassLoaderDataRoots(); - void always_strong_cld_do(CLDClosure* clds, uint worker_id); - void cld_do(CLDClosure* clds, uint worker_id); + void always_strong_cld_do(CLDClosure* clds, uint worker_id = 0); + void cld_do(CLDClosure* clds, uint worker_id = 0); }; class ShenandoahRootProcessor : public StackObj { @@ -217,7 +218,8 @@ ShenandoahThreadRoots _thread_roots; ShenandoahCodeCacheRoots _code_roots; ShenandoahJNIHandleRoots _jni_roots; - ShenandoahClassLoaderDataRoots _cld_roots; + ShenandoahClassLoaderDataRoots + _cld_roots; public: ShenandoahRootScanner(uint n_workers, ShenandoahPhaseTimings::Phase phase); @@ -242,7 +244,8 @@ ShenandoahSerialRoots _serial_roots; ShenandoahThreadRoots _thread_roots; ShenandoahJNIHandleRoots _jni_roots; - ShenandoahClassLoaderDataRoots _cld_roots; + ShenandoahClassLoaderDataRoots + _cld_roots; ShenandoahCodeCacheRoots _code_roots; public: @@ -257,7 +260,8 @@ private: ShenandoahSerialRoots _serial_roots; ShenandoahJNIHandleRoots _jni_roots; - ShenandoahClassLoaderDataRoots _cld_roots; + ShenandoahClassLoaderDataRoots + _cld_roots; ShenandoahThreadRoots _thread_roots; ShenandoahSerialWeakRoots _serial_weak_roots; ShenandoahWeakRoots _weak_roots; @@ -276,7 +280,8 @@ private: ShenandoahSerialRoots _serial_roots; ShenandoahJNIHandleRoots _jni_roots; - ShenandoahClassLoaderDataRoots _cld_roots; + ShenandoahClassLoaderDataRoots + _cld_roots; ShenandoahThreadRoots _thread_roots; ShenandoahSerialWeakRoots _serial_weak_roots; ShenandoahWeakRoots _weak_roots; @@ -296,7 +301,8 @@ private: ShenandoahSerialRoots _serial_roots; ShenandoahJNIHandleRoots _jni_roots; - ShenandoahClassLoaderDataRoots _cld_roots; + ShenandoahClassLoaderDataRoots + _cld_roots; ShenandoahThreadRoots _thread_roots; ShenandoahSerialWeakRoots _serial_weak_roots; ShenandoahWeakRoots _weak_roots; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.inline.hpp @@ -119,19 +119,32 @@ } } -template -ShenandoahClassLoaderDataRoots::ShenandoahClassLoaderDataRoots() { +template +ShenandoahClassLoaderDataRoots::ShenandoahClassLoaderDataRoots() { if (!SINGLE_THREADED) { ClassLoaderDataGraph::clear_claimed_marks(); } + if (CONCURRENT) { + ClassLoaderDataGraph_lock->lock(); + } } -template -void ShenandoahClassLoaderDataRoots::always_strong_cld_do(CLDClosure* clds, uint worker_id) { +template +ShenandoahClassLoaderDataRoots::~ShenandoahClassLoaderDataRoots() { + if (CONCURRENT) { + ClassLoaderDataGraph_lock->unlock(); + } +} + + +template +void ShenandoahClassLoaderDataRoots::always_strong_cld_do(CLDClosure* clds, uint worker_id) { if (SINGLE_THREADED) { assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread"); ClassLoaderDataGraph::always_strong_cld_do(clds); + } else if (CONCURRENT) { + ClassLoaderDataGraph::always_strong_cld_do(clds); } else { ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id); @@ -139,13 +152,15 @@ } } -template -void ShenandoahClassLoaderDataRoots::cld_do(CLDClosure* clds, uint worker_id) { +template +void ShenandoahClassLoaderDataRoots::cld_do(CLDClosure* clds, uint worker_id) { if (SINGLE_THREADED) { assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); assert(Thread::current()->is_VM_thread(), "Single threaded CLDG iteration can only be done by VM thread"); ClassLoaderDataGraph::cld_do(clds); - } else { + } else if (CONCURRENT) { + ClassLoaderDataGraph::cld_do(clds); + } else { ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CLDGRoots, worker_id); ClassLoaderDataGraph::cld_do(clds);