8229213: Shenandoah: Allow VM global oop storage to be processed concurrently

Reviewed-by: shade, rkennke
This commit is contained in:
Zhengyu Gu 2019-08-07 09:17:08 -04:00
parent 8251ba4817
commit 2b164a34ad
5 changed files with 52 additions and 33 deletions

View file

@ -1582,7 +1582,7 @@ void ShenandoahHeap::op_cleanup() {
class ShenandoahConcurrentRootsEvacUpdateTask : public AbstractGangTask { class ShenandoahConcurrentRootsEvacUpdateTask : public AbstractGangTask {
private: private:
ShenandoahJNIHandleRoots<true /*concurrent*/> _jni_roots; ShenandoahVMRoots<true /*concurrent*/> _vm_roots;
ShenandoahWeakRoots<true /*concurrent*/> _weak_roots; ShenandoahWeakRoots<true /*concurrent*/> _weak_roots;
ShenandoahClassLoaderDataRoots<true /*concurrent*/, false /*single threaded*/> _cld_roots; ShenandoahClassLoaderDataRoots<true /*concurrent*/, false /*single threaded*/> _cld_roots;
@ -1597,7 +1597,7 @@ public:
// jni_roots and weak_roots are OopStorage backed roots, concurrent iteration // jni_roots and weak_roots are OopStorage backed roots, concurrent iteration
// may race against OopStorage::release() calls. // may race against OopStorage::release() calls.
ShenandoahEvacUpdateOopStorageRootsClosure cl; ShenandoahEvacUpdateOopStorageRootsClosure cl;
_jni_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl); _vm_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl);
_weak_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl); _weak_roots.oops_do<ShenandoahEvacUpdateOopStorageRootsClosure>(&cl);
} }

View file

@ -52,6 +52,7 @@ class outputStream;
f(scan_jni_weak_roots, " S: JNI Weak Roots") \ f(scan_jni_weak_roots, " S: JNI Weak Roots") \
f(scan_stringtable_roots, " S: String Table Roots") \ f(scan_stringtable_roots, " S: String Table Roots") \
f(scan_resolved_method_table_roots, " S: Resolved Table Roots") \ f(scan_resolved_method_table_roots, " S: Resolved Table Roots") \
f(scan_vm_global_roots, " S: VM Global Roots") \
f(scan_vm_weak_roots, " S: VM Weak Roots") \ f(scan_vm_weak_roots, " S: VM Weak Roots") \
f(scan_synchronizer_roots, " S: Synchronizer Roots") \ f(scan_synchronizer_roots, " S: Synchronizer Roots") \
f(scan_management_roots, " S: Management Roots") \ f(scan_management_roots, " S: Management Roots") \
@ -78,6 +79,7 @@ class outputStream;
f(update_jni_weak_roots, " U: JNI Weak Roots") \ f(update_jni_weak_roots, " U: JNI Weak Roots") \
f(update_stringtable_roots, " U: String Table Roots") \ f(update_stringtable_roots, " U: String Table Roots") \
f(update_resolved_method_table_roots, " U: Resolved Table Roots") \ f(update_resolved_method_table_roots, " U: Resolved Table Roots") \
f(update_vm_global_roots, " U: VM Global Roots") \
f(update_vm_weak_roots, " U: VM Weak Roots") \ f(update_vm_weak_roots, " U: VM Weak Roots") \
f(update_synchronizer_roots, " U: Synchronizer Roots") \ f(update_synchronizer_roots, " U: Synchronizer Roots") \
f(update_management_roots, " U: Management Roots") \ f(update_management_roots, " U: Management Roots") \
@ -112,6 +114,7 @@ class outputStream;
f(evac_jni_weak_roots, " E: JNI Weak Roots") \ f(evac_jni_weak_roots, " E: JNI Weak Roots") \
f(evac_stringtable_roots, " E: String Table Roots") \ f(evac_stringtable_roots, " E: String Table Roots") \
f(evac_resolved_method_table_roots, " E: Resolved Table Roots") \ f(evac_resolved_method_table_roots, " E: Resolved Table Roots") \
f(evac_vm_global_roots, " E: VM Global Roots") \
f(evac_vm_weak_roots, " E: VM Weak Roots") \ f(evac_vm_weak_roots, " E: VM Weak Roots") \
f(evac_synchronizer_roots, " E: Synchronizer Roots") \ f(evac_synchronizer_roots, " E: Synchronizer Roots") \
f(evac_management_roots, " E: Management Roots") \ f(evac_management_roots, " E: Management Roots") \
@ -143,6 +146,7 @@ class outputStream;
f(final_update_jni_weak_roots, " UR: JNI Weak Roots") \ f(final_update_jni_weak_roots, " UR: JNI Weak Roots") \
f(final_update_stringtable_roots, " UR: String Table Roots") \ f(final_update_stringtable_roots, " UR: String Table Roots") \
f(final_update_resolved_method_table_roots, " UR: Resolved Table Roots") \ f(final_update_resolved_method_table_roots, " UR: Resolved Table Roots") \
f(final_update_vm_global_roots, " UR: VM Global Roots") \
f(final_update_vm_weak_roots, " UR: VM Weak Roots") \ f(final_update_vm_weak_roots, " UR: VM Weak Roots") \
f(final_update_refs_synchronizer_roots, " UR: Synchronizer Roots") \ f(final_update_refs_synchronizer_roots, " UR: Synchronizer Roots") \
f(final_update_refs_management_roots, " UR: Management Roots") \ f(final_update_refs_management_roots, " UR: Management Roots") \
@ -169,6 +173,7 @@ class outputStream;
f(degen_gc_update_jni_weak_roots, " DU: JNI Weak Roots") \ f(degen_gc_update_jni_weak_roots, " DU: JNI Weak Roots") \
f(degen_gc_update_stringtable_roots, " DU: String Table Roots") \ f(degen_gc_update_stringtable_roots, " DU: String Table Roots") \
f(degen_gc_update_resolved_method_table_roots, " DU: Resolved Table Roots") \ f(degen_gc_update_resolved_method_table_roots, " DU: Resolved Table Roots") \
f(degen_gc_update_vm_global_roots, " DU: VM Global Roots") \
f(degen_gc_update_vm_weak_roots, " DU: VM Weak Roots") \ f(degen_gc_update_vm_weak_roots, " DU: VM Weak Roots") \
f(degen_gc_update_synchronizer_roots, " DU: Synchronizer Roots") \ f(degen_gc_update_synchronizer_roots, " DU: Synchronizer Roots") \
f(degen_gc_update_management_roots, " DU: Management Roots") \ f(degen_gc_update_management_roots, " DU: Management Roots") \
@ -196,6 +201,7 @@ class outputStream;
f(init_traversal_gc_jni_weak_roots, " TI: JNI Weak Roots") \ f(init_traversal_gc_jni_weak_roots, " TI: JNI Weak Roots") \
f(init_traversal_gc_stringtable_roots, " TI: String Table Roots") \ f(init_traversal_gc_stringtable_roots, " TI: String Table Roots") \
f(init_traversal_gc_resolved_method_table_roots, " TI: Resolved Table Roots") \ f(init_traversal_gc_resolved_method_table_roots, " TI: Resolved Table Roots") \
f(init_traversal_gc_vm_global_roots, " TI: VM Global Roots") \
f(init_traversal_gc_vm_weak_roots, " TI: VM Weak Roots") \ f(init_traversal_gc_vm_weak_roots, " TI: VM Weak Roots") \
f(init_traversal_gc_synchronizer_roots, " TI: Synchronizer Roots") \ f(init_traversal_gc_synchronizer_roots, " TI: Synchronizer Roots") \
f(init_traversal_gc_management_roots, " TI: Management Roots") \ f(init_traversal_gc_management_roots, " TI: Management Roots") \
@ -220,6 +226,7 @@ class outputStream;
f(final_traversal_gc_jni_weak_roots, " TF: JNI Weak Roots") \ f(final_traversal_gc_jni_weak_roots, " TF: JNI Weak Roots") \
f(final_traversal_gc_stringtable_roots, " TF: String Table Roots") \ f(final_traversal_gc_stringtable_roots, " TF: String Table Roots") \
f(final_traversal_gc_resolved_method_table_roots, " TF: Resolved Table Roots") \ f(final_traversal_gc_resolved_method_table_roots, " TF: Resolved Table Roots") \
f(final_traversal_gc_vm_global_roots, " TF: VM Global Roots") \
f(final_traversal_gc_vm_weak_roots, " TF: VM Weak Roots") \ f(final_traversal_gc_vm_weak_roots, " TF: VM Weak Roots") \
f(final_traversal_gc_synchronizer_roots, " TF: Synchronizer Roots") \ f(final_traversal_gc_synchronizer_roots, " TF: Synchronizer Roots") \
f(final_traversal_gc_management_roots, " TF: Management Roots") \ f(final_traversal_gc_management_roots, " TF: Management Roots") \
@ -242,6 +249,7 @@ class outputStream;
f(final_traversal_update_jni_weak_roots, " TU: JNI Weak Roots") \ f(final_traversal_update_jni_weak_roots, " TU: JNI Weak Roots") \
f(final_traversal_update_stringtable_roots, " TU: String Table Roots") \ f(final_traversal_update_stringtable_roots, " TU: String Table Roots") \
f(final_traversal_update_resolved_method_table_roots, " TU: Resolved Table Roots") \ f(final_traversal_update_resolved_method_table_roots, " TU: Resolved Table Roots") \
f(final_traversal_update_vm_global_roots, " TU: VM Global Roots") \
f(final_traversal_update_vm_weak_roots, " TU: VM Weak Roots") \ f(final_traversal_update_vm_weak_roots, " TU: VM Weak Roots") \
f(final_traversal_update_synchronizer_roots, " TU: Synchronizer Roots") \ f(final_traversal_update_synchronizer_roots, " TU: Synchronizer Roots") \
f(final_traversal_update_management_roots, " TU: Management Roots") \ f(final_traversal_update_management_roots, " TU: Management Roots") \
@ -270,6 +278,7 @@ class outputStream;
f(full_gc_jni_weak_roots, " F: JNI Weak Roots") \ f(full_gc_jni_weak_roots, " F: JNI Weak Roots") \
f(full_gc_stringtable_roots, " F: String Table Roots") \ f(full_gc_stringtable_roots, " F: String Table Roots") \
f(full_gc_resolved_method_table_roots, " F: Resolved Table Roots") \ f(full_gc_resolved_method_table_roots, " F: Resolved Table Roots") \
f(full_gc_vm_global_roots, " F: VM Global Roots") \
f(full_gc_vm_weak_roots, " F: VM Weak Roots") \ f(full_gc_vm_weak_roots, " F: VM Weak Roots") \
f(full_gc_synchronizer_roots, " F: Synchronizer Roots") \ f(full_gc_synchronizer_roots, " F: Synchronizer Roots") \
f(full_gc_management_roots, " F: Management Roots") \ f(full_gc_management_roots, " F: Management Roots") \
@ -330,6 +339,7 @@ class outputStream;
f(JNIWeakRoots, "JNI Weak Roots (ms):") \ f(JNIWeakRoots, "JNI Weak Roots (ms):") \
f(StringTableRoots, "StringTable Roots(ms):") \ f(StringTableRoots, "StringTable Roots(ms):") \
f(ResolvedMethodTableRoots, "Resolved Table Roots(ms):") \ f(ResolvedMethodTableRoots, "Resolved Table Roots(ms):") \
f(VMGlobalRoots, "VM Global Roots(ms)") \
f(VMWeakRoots, "VM Weak Roots(ms)") \ f(VMWeakRoots, "VM Weak Roots(ms)") \
f(ObjectSynchronizerRoots, "ObjectSynchronizer Roots (ms):") \ f(ObjectSynchronizerRoots, "ObjectSynchronizer Roots (ms):") \
f(ManagementRoots, "Management Roots (ms):") \ f(ManagementRoots, "Management Roots (ms):") \

View file

@ -52,9 +52,9 @@ void ShenandoahSerialRoot::oops_do(OopClosure* cl, uint worker_id) {
} }
} }
// Default the second argument for SD::oops_do. // Overwrite the second argument for SD::oops_do, don't include vm global oop storage.
static void system_dictionary_oops_do(OopClosure* cl) { static void system_dictionary_oops_do(OopClosure* cl) {
SystemDictionary::oops_do(cl); SystemDictionary::oops_do(cl, false);
} }
ShenandoahSerialRoots::ShenandoahSerialRoots() : ShenandoahSerialRoots::ShenandoahSerialRoots() :
@ -173,7 +173,7 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
_serial_weak_roots.weak_oops_do(oops, worker_id); _serial_weak_roots.weak_oops_do(oops, worker_id);
if (_include_concurrent_roots) { if (_include_concurrent_roots) {
CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
_jni_roots.oops_do<OopClosure>(oops, worker_id); _vm_roots.oops_do<OopClosure>(oops, worker_id);
_cld_roots.cld_do(&clds, worker_id); _cld_roots.cld_do(&clds, worker_id);
_weak_roots.oops_do<OopClosure>(oops, worker_id); _weak_roots.oops_do<OopClosure>(oops, worker_id);
} }
@ -202,7 +202,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
AlwaysTrueClosure always_true; AlwaysTrueClosure always_true;
_serial_roots.oops_do(oops, worker_id); _serial_roots.oops_do(oops, worker_id);
_jni_roots.oops_do(oops, worker_id); _vm_roots.oops_do(oops, worker_id);
_thread_roots.oops_do(oops, NULL, worker_id); _thread_roots.oops_do(oops, NULL, worker_id);
_cld_roots.cld_do(&adjust_cld_closure, worker_id); _cld_roots.cld_do(&adjust_cld_closure, worker_id);
@ -227,7 +227,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
ResourceMark rm; ResourceMark rm;
_serial_roots.oops_do(oops, 0); _serial_roots.oops_do(oops, 0);
_jni_roots.oops_do(oops, 0); _vm_roots.oops_do(oops, 0);
_cld_roots.cld_do(&clds, 0); _cld_roots.cld_do(&clds, 0);
_thread_roots.threads_do(&tc_cl, 0); _thread_roots.threads_do(&tc_cl, 0);
_code_roots.code_blobs_do(&code, 0); _code_roots.code_blobs_do(&code, 0);
@ -242,7 +242,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
ResourceMark rm; ResourceMark rm;
_serial_roots.oops_do(oops, 0); _serial_roots.oops_do(oops, 0);
_jni_roots.oops_do(oops, 0); _vm_roots.oops_do(oops, 0);
_cld_roots.always_strong_cld_do(&clds, 0); _cld_roots.always_strong_cld_do(&clds, 0);
_thread_roots.threads_do(&tc_cl, 0); _thread_roots.threads_do(&tc_cl, 0);
} }

View file

@ -93,17 +93,23 @@ public:
}; };
template <bool CONCURRENT> template <bool CONCURRENT>
class ShenandoahWeakRoot { class ShenandoahVMRoot {
private: private:
OopStorage::ParState<CONCURRENT, false /* is_const */> _itr; OopStorage::ParState<CONCURRENT, false /* is_const */> _itr;
const ShenandoahPhaseTimings::GCParPhases _phase; const ShenandoahPhaseTimings::GCParPhases _phase;
public: public:
ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase); ShenandoahVMRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase);
template <typename Closure> template <typename Closure>
void oops_do(Closure* cl, uint worker_id); void oops_do(Closure* cl, uint worker_id);
}; };
template <bool CONCURRENT>
class ShenandoahWeakRoot : public ShenandoahVMRoot<CONCURRENT> {
public:
ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase);
};
template <> template <>
class ShenandoahWeakRoot<false /*concurrent*/> { class ShenandoahWeakRoot<false /*concurrent*/> {
private: private:
@ -150,11 +156,13 @@ public:
}; };
template <bool CONCURRENT> template <bool CONCURRENT>
class ShenandoahJNIHandleRoots { class ShenandoahVMRoots {
private: private:
OopStorage::ParState<CONCURRENT, false /*is_const*/> _itr; ShenandoahVMRoot<CONCURRENT> _jni_handle_roots;
ShenandoahVMRoot<CONCURRENT> _vm_global_roots;
public: public:
ShenandoahJNIHandleRoots(); ShenandoahVMRoots();
template <typename T> template <typename T>
void oops_do(T* cl, uint worker_id = 0); void oops_do(T* cl, uint worker_id = 0);
@ -217,7 +225,7 @@ private:
ShenandoahSerialRoots _serial_roots; ShenandoahSerialRoots _serial_roots;
ShenandoahThreadRoots _thread_roots; ShenandoahThreadRoots _thread_roots;
ShenandoahCodeCacheRoots<ITR> _code_roots; ShenandoahCodeCacheRoots<ITR> _code_roots;
ShenandoahJNIHandleRoots<false /*concurrent*/ > _jni_roots; ShenandoahVMRoots<false /*concurrent*/ > _vm_roots;
ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/> ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/>
_cld_roots; _cld_roots;
public: public:
@ -243,7 +251,7 @@ class ShenandoahHeapIterationRootScanner : public ShenandoahRootProcessor {
private: private:
ShenandoahSerialRoots _serial_roots; ShenandoahSerialRoots _serial_roots;
ShenandoahThreadRoots _thread_roots; ShenandoahThreadRoots _thread_roots;
ShenandoahJNIHandleRoots<false /*concurrent*/> _jni_roots; ShenandoahVMRoots<false /*concurrent*/> _vm_roots;
ShenandoahClassLoaderDataRoots<false /*concurrent*/, true /*single threaded*/> ShenandoahClassLoaderDataRoots<false /*concurrent*/, true /*single threaded*/>
_cld_roots; _cld_roots;
ShenandoahCodeCacheRoots<ShenandoahAllCodeRootsIterator> _code_roots; ShenandoahCodeCacheRoots<ShenandoahAllCodeRootsIterator> _code_roots;
@ -259,7 +267,7 @@ public:
class ShenandoahRootEvacuator : public ShenandoahRootProcessor { class ShenandoahRootEvacuator : public ShenandoahRootProcessor {
private: private:
ShenandoahSerialRoots _serial_roots; ShenandoahSerialRoots _serial_roots;
ShenandoahJNIHandleRoots<false /*concurrent*/> _jni_roots; ShenandoahVMRoots<false /*concurrent*/> _vm_roots;
ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/> ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/>
_cld_roots; _cld_roots;
ShenandoahThreadRoots _thread_roots; ShenandoahThreadRoots _thread_roots;
@ -279,7 +287,7 @@ public:
class ShenandoahRootUpdater : public ShenandoahRootProcessor { class ShenandoahRootUpdater : public ShenandoahRootProcessor {
private: private:
ShenandoahSerialRoots _serial_roots; ShenandoahSerialRoots _serial_roots;
ShenandoahJNIHandleRoots<false /*concurrent*/> _jni_roots; ShenandoahVMRoots<false /*concurrent*/> _vm_roots;
ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/> ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/>
_cld_roots; _cld_roots;
ShenandoahThreadRoots _thread_roots; ShenandoahThreadRoots _thread_roots;
@ -300,7 +308,7 @@ public:
class ShenandoahRootAdjuster : public ShenandoahRootProcessor { class ShenandoahRootAdjuster : public ShenandoahRootProcessor {
private: private:
ShenandoahSerialRoots _serial_roots; ShenandoahSerialRoots _serial_roots;
ShenandoahJNIHandleRoots<false /*concurrent*/> _jni_roots; ShenandoahVMRoots<false /*concurrent*/> _vm_roots;
ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/> ShenandoahClassLoaderDataRoots<false /*concurrent*/, false /*single threaded*/>
_cld_roots; _cld_roots;
ShenandoahThreadRoots _thread_roots; ShenandoahThreadRoots _thread_roots;

View file

@ -37,13 +37,13 @@
#include "runtime/safepoint.hpp" #include "runtime/safepoint.hpp"
template <bool CONCURRENT> template <bool CONCURRENT>
inline ShenandoahWeakRoot<CONCURRENT>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase) : inline ShenandoahVMRoot<CONCURRENT>::ShenandoahVMRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase) :
_itr(storage), _phase(phase) { _itr(storage), _phase(phase) {
} }
template <bool CONCURRENT> template <bool CONCURRENT>
template <typename Closure> template <typename Closure>
inline void ShenandoahWeakRoot<CONCURRENT>::oops_do(Closure* cl, uint worker_id) { inline void ShenandoahVMRoot<CONCURRENT>::oops_do(Closure* cl, uint worker_id) {
if (CONCURRENT) { if (CONCURRENT) {
_itr.oops_do(cl); _itr.oops_do(cl);
} else { } else {
@ -53,6 +53,11 @@ inline void ShenandoahWeakRoot<CONCURRENT>::oops_do(Closure* cl, uint worker_id)
} }
} }
template <bool CONCURRENT>
inline ShenandoahWeakRoot<CONCURRENT>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase) :
ShenandoahVMRoot<CONCURRENT>(storage, phase) {
}
inline ShenandoahWeakRoot<false>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase) : inline ShenandoahWeakRoot<false>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::GCParPhases phase) :
_itr(storage), _phase(phase) { _itr(storage), _phase(phase) {
} }
@ -103,20 +108,16 @@ void ShenandoahWeakRoots<false /* concurrent */>::oops_do(Closure* cl, uint work
} }
template <bool CONCURRENT> template <bool CONCURRENT>
ShenandoahJNIHandleRoots<CONCURRENT>::ShenandoahJNIHandleRoots() : ShenandoahVMRoots<CONCURRENT>::ShenandoahVMRoots() :
_itr(JNIHandles::global_handles()) { _jni_handle_roots(JNIHandles::global_handles(), ShenandoahPhaseTimings::JNIRoots),
_vm_global_roots(SystemDictionary::vm_global_oop_storage(), ShenandoahPhaseTimings::VMGlobalRoots) {
} }
template <bool CONCURRENT> template <bool CONCURRENT>
template <typename T> template <typename T>
void ShenandoahJNIHandleRoots<CONCURRENT>::oops_do(T* cl, uint worker_id) { void ShenandoahVMRoots<CONCURRENT>::oops_do(T* cl, uint worker_id) {
if (CONCURRENT) { _jni_handle_roots.oops_do(cl, worker_id);
_itr.oops_do(cl); _vm_global_roots.oops_do(cl, worker_id);
} else {
ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times();
ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::JNIRoots, worker_id);
_itr.oops_do(cl);
}
} }
template <bool CONCURRENT, bool SINGLE_THREADED> template <bool CONCURRENT, bool SINGLE_THREADED>
@ -231,7 +232,7 @@ void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDC
ResourceMark rm; ResourceMark rm;
_serial_roots.oops_do(oops, worker_id); _serial_roots.oops_do(oops, worker_id);
_jni_roots.oops_do(oops, worker_id); _vm_roots.oops_do(oops, worker_id);
if (clds != NULL) { if (clds != NULL) {
_cld_roots.cld_do(clds, worker_id); _cld_roots.cld_do(clds, worker_id);
@ -256,7 +257,7 @@ void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oop
ResourceMark rm; ResourceMark rm;
_serial_roots.oops_do(oops, worker_id); _serial_roots.oops_do(oops, worker_id);
_jni_roots.oops_do(oops, worker_id); _vm_roots.oops_do(oops, worker_id);
_cld_roots.always_strong_cld_do(clds, worker_id); _cld_roots.always_strong_cld_do(clds, worker_id);
_thread_roots.threads_do(&tc_cl, worker_id); _thread_roots.threads_do(&tc_cl, worker_id);
} }
@ -267,7 +268,7 @@ void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAliv
CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong); CLDToOopClosure clds(keep_alive, ClassLoaderData::_claim_strong);
_serial_roots.oops_do(keep_alive, worker_id); _serial_roots.oops_do(keep_alive, worker_id);
_jni_roots.oops_do(keep_alive, worker_id); _vm_roots.oops_do(keep_alive, worker_id);
_thread_roots.oops_do(keep_alive, NULL, worker_id); _thread_roots.oops_do(keep_alive, NULL, worker_id);
_cld_roots.cld_do(&clds, worker_id); _cld_roots.cld_do(&clds, worker_id);