diff a/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp b/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp --- a/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp +++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp @@ -96,13 +96,12 @@ bool _complete; bool do_cldg_roots(); bool do_object_synchronizer_roots(); bool do_universe_roots(); - bool do_jni_handle_roots(); + bool do_oop_storage_roots(); bool do_jvmti_roots(); - bool do_vm_global_roots(); bool do_management_roots(); bool do_string_table_roots(); bool do_aot_loader_roots(); bool do_roots(); @@ -146,31 +145,35 @@ ReferenceLocateClosure rlc(_callback, OldObjectRoot::_universe, OldObjectRoot::_type_undetermined, NULL); Universe::oops_do(&rlc); return rlc.complete(); } -bool ReferenceToRootClosure::do_jni_handle_roots() { - assert(!complete(), "invariant"); - ReferenceLocateClosure rlc(_callback, OldObjectRoot::_global_jni_handles, OldObjectRoot::_global_jni_handle, NULL); - JNIHandles::oops_do(&rlc); - return rlc.complete(); +bool ReferenceToRootClosure::do_oop_storage_roots() { + int i = 0; + for (OopStorageSet::Iterator it = OopStorageSet::strong_iterator(); !it.is_end(); ++it, ++i) { + assert(!complete(), "invariant"); + OopStorage* oop_storage = *it; + OldObjectRoot::Type type = oop_storage == OopStorageSet::jni_global() ? + OldObjectRoot::_global_jni_handle : + OldObjectRoot::_global_oop_handle; + OldObjectRoot::System system = OldObjectRoot::System(OldObjectRoot::_strong_oop_storage_set_first + i); + ReferenceLocateClosure rlc(_callback, system, type, NULL); + oop_storage->oops_do(&rlc); + if (rlc.complete()) { + return true; + } + } + return false; } bool ReferenceToRootClosure::do_jvmti_roots() { assert(!complete(), "invariant"); ReferenceLocateClosure rlc(_callback, OldObjectRoot::_jvmti, OldObjectRoot::_global_jni_handle, NULL); JvmtiExport::oops_do(&rlc); return rlc.complete(); } -bool ReferenceToRootClosure::do_vm_global_roots() { - assert(!complete(), "invariant"); - ReferenceLocateClosure rlc(_callback, OldObjectRoot::_vm_global, OldObjectRoot::_type_undetermined, NULL); - OopStorageSet::vm_global()->oops_do(&rlc); - return rlc.complete(); -} - bool ReferenceToRootClosure::do_management_roots() { assert(!complete(), "invariant"); ReferenceLocateClosure rlc(_callback, OldObjectRoot::_management, OldObjectRoot::_type_undetermined, NULL); Management::oops_do(&rlc); return rlc.complete(); @@ -201,25 +204,20 @@ if (do_universe_roots()) { _complete = true; return true; } - if (do_jni_handle_roots()) { + if (do_oop_storage_roots()) { _complete = true; return true; } if (do_jvmti_roots()) { _complete = true; return true; } - if (do_vm_global_roots()) { - _complete = true; - return true; - } - if (do_management_roots()) { _complete = true; return true; }