< prev index next >

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

Print this page

        

@@ -434,10 +434,11 @@
   _has_overflown(false),
   _concurrent(false),
   _has_aborted(false),
   _restart_for_overflow(false),
   _concurrent_marking_in_progress(false),
+  _concurrent_marking_from_roots(false),
 
   // _verbose_level set below
 
   _init_times(),
   _remark_times(), _remark_mark_times(), _remark_weak_ref_times(),

@@ -1001,18 +1002,32 @@
     // mainly used for sanity checking.
     root_regions()->scan_finished();
   }
 }
 
+void ConcurrentMark::register_mark_from_roots_phase_start() {
+  _concurrent_marking_from_roots = true;
+  _g1h->gc_timer_cm()->register_gc_concurrent_start("Concurrent Mark");
+}
+
+void ConcurrentMark::register_mark_from_roots_phase_end() {
+  _concurrent_marking_from_roots = false;
+  if (!has_aborted()) {
+    _g1h->gc_timer_cm()->register_gc_concurrent_end();
+  }
+}
+
 void ConcurrentMark::markFromRoots() {
   // we might be tempted to assert that:
   // assert(asynch == !SafepointSynchronize::is_at_safepoint(),
   //        "inconsistent argument?");
   // However that wouldn't be right, because it's possible that
   // a safepoint is indeed in progress as a younger generation
   // stop-the-world GC happens even as we mark in this generation.
 
+  register_mark_from_roots_phase_start();
+
   _restart_for_overflow = false;
 
   // _g1h has _n_par_threads
   _parallel_marking_threads = calc_parallel_marking_threads();
   assert(parallel_marking_threads() <= max_parallel_marking_threads(),

@@ -1025,10 +1040,13 @@
   set_concurrency_and_phase(active_workers, true /* concurrent */);
 
   CMConcurrentMarkingTask markingTask(this, cmThread());
   _parallel_workers->set_active_workers(active_workers);
   _parallel_workers->run_task(&markingTask);
+
+  register_mark_from_roots_phase_end();
+
   print_stats();
 }
 
 void ConcurrentMark::checkpointRootsFinal(bool clear_all_soft_refs) {
   // world is stopped at this checkpoint
< prev index next >