< prev index next >

src/hotspot/share/gc/parallel/psScavenge.cpp

Print this page

        

@@ -42,11 +42,12 @@
 #include "gc/shared/gcTimer.hpp"
 #include "gc/shared/gcTrace.hpp"
 #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"
 #include "gc/shared/scavengableNMethods.hpp"
 #include "gc/shared/spaceDecorator.inline.hpp"

@@ -94,22 +95,14 @@
   switch (root_type) {
     case ParallelRootType::universe:
       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);
         ClassLoaderDataGraph::cld_do(&cld_closure);
       }

@@ -310,10 +303,11 @@
   }
 };
 
 class ScavengeRootsTask : public AbstractGangTask {
   StrongRootsScope _strong_roots_scope; // needed for Threads::possibly_parallel_threads_do
+  OopStorageSetStrongParState<false /* concurrent */, false /* is_const */> _oop_storage_strong_par_state;
   SequentialSubTasksDone _subtasks;
   PSOldGen* _old_gen;
   HeapWord* _gen_top;
   uint _active_workers;
   bool _is_empty;

@@ -371,10 +365,18 @@
     _subtasks.all_tasks_completed();
 
     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
     // stacks and expects a steal_work() to complete the draining if
     // ParallelGCThreads is > 1.
< prev index next >