--- old/src/hotspot/share/gc/parallel/psParallelCompact.cpp 2020-06-23 12:27:44.805298354 +0200 +++ new/src/hotspot/share/gc/parallel/psParallelCompact.cpp 2020-06-23 12:27:44.517292139 +0200 @@ -50,7 +50,8 @@ #include "gc/shared/gcTraceTime.inline.hpp" #include "gc/shared/isGCActiveMark.hpp" #include "gc/shared/oopStorage.inline.hpp" -#include "gc/shared/oopStorageSet.hpp" +#include "gc/shared/oopStorageSet.inline.hpp" +#include "gc/shared/oopStorageSetParState.inline.hpp" #include "gc/shared/referencePolicy.hpp" #include "gc/shared/referenceProcessor.hpp" #include "gc/shared/referenceProcessorPhaseTimes.hpp" @@ -2015,10 +2016,6 @@ Universe::oops_do(&mark_and_push_closure); break; - case ParallelRootType::jni_handles: - JNIHandles::oops_do(&mark_and_push_closure); - break; - case ParallelRootType::object_synchronizer: ObjectSynchronizer::oops_do(&mark_and_push_closure); break; @@ -2031,10 +2028,6 @@ JvmtiExport::oops_do(&mark_and_push_closure); break; - case ParallelRootType::vm_global: - OopStorageSet::vm_global()->oops_do(&mark_and_push_closure); - break; - case ParallelRootType::class_loader_data: { CLDToOopClosure cld_closure(&mark_and_push_closure, ClassLoaderData::_claim_strong); @@ -2081,6 +2074,7 @@ class MarkFromRootsTask : public AbstractGangTask { typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask; StrongRootsScope _strong_roots_scope; // needed for Threads::possibly_parallel_threads_do + OopStorageSetStrongParState _oop_storage_set_par_state; SequentialSubTasksDone _subtasks; TaskTerminator _terminator; uint _active_workers; @@ -2105,6 +2099,15 @@ PCAddThreadRootsMarkingTaskClosure closure(worker_id); Threads::possibly_parallel_threads_do(true /*parallel */, &closure); + // Mark from OopStorages + { + ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(worker_id); + PCMarkAndPushClosure closure(cm); + _oop_storage_set_par_state.oops_do(&closure); + // Do the real work + cm->follow_marking_stacks(); + } + if (_active_workers > 1) { steal_marking_work(_terminator, worker_id); } @@ -2235,12 +2238,11 @@ // General strong roots. Universe::oops_do(&oop_closure); - JNIHandles::oops_do(&oop_closure); // Global (strong) JNI handles Threads::oops_do(&oop_closure, NULL); ObjectSynchronizer::oops_do(&oop_closure); Management::oops_do(&oop_closure); JvmtiExport::oops_do(&oop_closure); - OopStorageSet::vm_global()->oops_do(&oop_closure); + OopStorageSet::strong_oops_do(&oop_closure); CLDToOopClosure cld_closure(&oop_closure, ClassLoaderData::_claim_strong); ClassLoaderDataGraph::cld_do(&cld_closure); --- old/src/hotspot/share/gc/parallel/psRootType.hpp 2020-06-23 12:27:45.513313634 +0200 +++ new/src/hotspot/share/gc/parallel/psRootType.hpp 2020-06-23 12:27:45.257308109 +0200 @@ -35,10 +35,8 @@ // We do not want any holes in the enum as we enumerate these values by incrementing them. enum Value { universe, - jni_handles, object_synchronizer, management, - vm_global, class_loader_data, jvmti, code_cache, --- old/src/hotspot/share/gc/parallel/psScavenge.cpp 2020-06-23 12:27:46.165327704 +0200 +++ new/src/hotspot/share/gc/parallel/psScavenge.cpp 2020-06-23 12:27:45.885321662 +0200 @@ -44,7 +44,8 @@ #include "gc/shared/gcTraceTime.inline.hpp" #include "gc/shared/isGCActiveMark.hpp" #include "gc/shared/oopStorage.inline.hpp" -#include "gc/shared/oopStorageSet.hpp" +#include "gc/shared/oopStorageSetParState.inline.hpp" +#include "gc/shared/oopStorageParState.inline.hpp" #include "gc/shared/referencePolicy.hpp" #include "gc/shared/referenceProcessor.hpp" #include "gc/shared/referenceProcessorPhaseTimes.hpp" @@ -96,18 +97,10 @@ Universe::oops_do(&roots_closure); break; - case ParallelRootType::jni_handles: - JNIHandles::oops_do(&roots_closure); - break; - case ParallelRootType::object_synchronizer: ObjectSynchronizer::oops_do(&roots_closure); break; - case ParallelRootType::vm_global: - OopStorageSet::vm_global()->oops_do(&roots_closure); - break; - case ParallelRootType::class_loader_data: { PSScavengeCLDClosure cld_closure(pm); @@ -312,6 +305,7 @@ class ScavengeRootsTask : public AbstractGangTask { StrongRootsScope _strong_roots_scope; // needed for Threads::possibly_parallel_threads_do + OopStorageSetStrongParState _oop_storage_strong_par_state; SequentialSubTasksDone _subtasks; PSOldGen* _old_gen; HeapWord* _gen_top; @@ -373,6 +367,14 @@ PSThreadRootsTaskClosure closure(worker_id); Threads::possibly_parallel_threads_do(true /*parallel */, &closure); + // Scavenge OopStorages + { + PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(worker_id); + PSScavengeRootsClosure closure(pm); + _oop_storage_strong_par_state.oops_do(&closure); + // Do the real work + pm->drain_stacks(false); + } // If active_workers can exceed 1, add a steal_work(). // PSPromotionManager::drain_stacks_depth() does not fully drain its