< prev index next >

src/share/vm/gc_implementation/g1/concurrentMark.cpp

Print this page

        

@@ -2663,11 +2663,10 @@
 
   G1CMTraceTime trace("Finalize Marking", G1Log::finer());
 
   g1h->ensure_parsability(false);
 
-  StrongRootsScope srs;
   // this is remark, so we'll use up all active threads
   uint active_workers = g1h->workers()->active_workers();
   if (active_workers == 0) {
     assert(active_workers > 0, "Should have been set earlier");
     active_workers = (uint) ParallelGCThreads;

@@ -2677,17 +2676,21 @@
   // Leave _parallel_marking_threads at it's
   // value originally calculated in the ConcurrentMark
   // constructor and pass values of the active workers
   // through the gang in the task.
 
+  {
+    StrongRootsScope srs(active_workers);
+
   CMRemarkTask remarkTask(this, active_workers);
   // We will start all available threads, even if we decide that the
   // active_workers will be fewer. The extra ones will just bail out
   // immediately.
   g1h->set_par_threads(active_workers);
   g1h->workers()->run_task(&remarkTask);
   g1h->set_par_threads(0);
+  }
 
   SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
   guarantee(has_overflown() ||
             satb_mq_set.completed_buffers_num() == 0,
             err_msg("Invariant: has_overflown = %s, num buffers = %d",
< prev index next >