changeset 7465:2868d01310a4

More detailed timing summary.
author Roman Kennke <rkennke@redhat.com>
date Thu, 12 Feb 2015 17:33:38 +0100
parents cc302a9b1bdc
children 8a704517c74e
files src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.hpp src/share/vm/gc_implementation/shenandoah/shenandoahConcurrentMark.cpp src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp
diffstat 5 files changed, 105 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp	Wed Feb 11 23:46:45 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.cpp	Thu Feb 12 17:33:38 2015 +0100
@@ -365,8 +365,17 @@
 ShenandoahCollectorPolicy::ShenandoahCollectorPolicy() {
   initialize_all();
 
+  _user_requested_gcs = 0;
+
   _phase_names[init_mark] = "InitMark";
   _phase_names[final_mark] = "FinalMark";
+  _phase_names[final_mark] = "RescanRoots";
+  _phase_names[final_mark] = "DrainSATB";
+  _phase_names[final_mark] = "DrainOverflow";
+  _phase_names[final_mark] = "DrainQueues";
+  _phase_names[final_mark] = "WeakRefs";
+  _phase_names[final_mark] = "PrepareEvac";
+  _phase_names[final_mark] = "InitEvac";
   _phase_names[final_evac] = "FinalEvacuation";
   _phase_names[final_uprefs] = "FinalUpdateRefs";
 
@@ -467,6 +476,10 @@
   _heuristics->record_bytes_reclaimed(bytes);
 }
 
+void ShenandoahCollectorPolicy::record_user_requested_gc() {
+  _user_requested_gcs++;
+}
+
 bool ShenandoahCollectorPolicy::should_start_concurrent_mark(size_t used,
 							     size_t capacity) {
   ShenandoahHeap* heap = ShenandoahHeap::heap();
@@ -481,30 +494,61 @@
 }
 
 void ShenandoahCollectorPolicy::print_tracing_info() {
-  print_summary_sd("Initial Mark Pauses", &(_timing_data[init_mark]._ms));
-  print_summary_sd("Final Mark Pauses", &(_timing_data[final_mark]._ms));
-  print_summary_sd("Final Evacuation Pauses", &(_timing_data[final_evac]._ms));
-  print_summary_sd("Final Update Refs Pauses", &(_timing_data[final_uprefs]._ms));
-  print_summary_sd("  Update roots", &(_timing_data[update_roots]._ms));
-  print_summary_sd("  Recycle regions", &(_timing_data[recycle_regions]._ms));
+  print_summary_sd("Initial Mark Pauses", 0, &(_timing_data[init_mark]._ms));
+  print_summary_sd("Final Mark Pauses", 0, &(_timing_data[final_mark]._ms));
+
+  print_summary_sd("Rescan Roots", 2, &(_timing_data[rescan_roots]._ms));
+  print_summary_sd("Drain SATB", 2, &(_timing_data[drain_satb]._ms));
+  print_summary_sd("Drain Overflow", 2, &(_timing_data[drain_overflow]._ms));
+  print_summary_sd("Drain Queues", 2, &(_timing_data[drain_queues]._ms));
+  print_summary_sd("Weak References", 2, &(_timing_data[weakrefs]._ms));
+  print_summary_sd("Prepare Evacuation", 2, &(_timing_data[prepare_evac]._ms));
+  print_summary_sd("Initial Evacuation", 2, &(_timing_data[init_evac]._ms));
+
+  print_summary_sd("Final Evacuation Pauses", 0, &(_timing_data[final_evac]._ms));
+  print_summary_sd("Final Update Refs Pauses", 0, &(_timing_data[final_uprefs]._ms));
+  print_summary_sd("Update roots", 2, &(_timing_data[update_roots]._ms));
+  print_summary_sd("Recycle regions", 2, &(_timing_data[recycle_regions]._ms));
   if (! ShenandoahUpdateRefsEarly) {
-    print_summary_sd("  Reset bitmaps", &(_timing_data[reset_bitmaps]._ms));
+    print_summary_sd("Reset bitmaps", 2, &(_timing_data[reset_bitmaps]._ms));
   }
-  print_summary_sd("  Resize TLABs", &(_timing_data[resize_tlabs]._ms));
+  print_summary_sd("Resize TLABs", 2, &(_timing_data[resize_tlabs]._ms));
+  gclog_or_tty->print_cr(" ");
+  print_summary_sd("Concurrent Marking Times", 0, &(_timing_data[conc_mark]._ms));
+  print_summary_sd("Concurrent Evacuation Times", 0, &(_timing_data[conc_evac]._ms));
+  print_summary_sd("Full GC Times", 0, &(_timing_data[full_gc]._ms));
+
+  gclog_or_tty->print_cr("User requested GCs: "SIZE_FORMAT, _user_requested_gcs);
+
   gclog_or_tty->print_cr(" ");
-  print_summary_sd("Concurrent Marking Times", &(_timing_data[conc_mark]._ms));
-  print_summary_sd("Concurrent Evacuation Times", &(_timing_data[conc_evac]._ms));
-  print_summary_sd("Full GC Times", &(_timing_data[full_gc]._ms));
+  double total_sum = _timing_data[init_mark]._ms.sum() +
+    _timing_data[final_mark]._ms.sum() +
+    _timing_data[final_evac]._ms.sum() +
+    _timing_data[final_uprefs]._ms.sum();
+  double total_avg = (_timing_data[init_mark]._ms.avg() +
+                      _timing_data[final_mark]._ms.avg() +
+                      _timing_data[final_evac]._ms.avg() +
+                      _timing_data[final_uprefs]._ms.avg()) / 4.0;
+  double total_max = MAX2(
+                          MAX2(
+                               MAX2(_timing_data[init_mark]._ms.maximum(),
+                                    _timing_data[final_mark]._ms.maximum()),
+                               _timing_data[final_evac]._ms.maximum()),
+                          _timing_data[final_uprefs]._ms.maximum());
+
+  gclog_or_tty->print_cr("%-27s = %8.2lf s, avg = %8.2lf ms, max = %8.2lf ms",
+                         "Total", total_sum / 1000.0, total_avg, total_max);
+
 }
 
-void ShenandoahCollectorPolicy::print_summary(const char* str, const NumberSeq* seq)  {
+void ShenandoahCollectorPolicy::print_summary_sd(const char* str, uint indent, const NumberSeq* seq) {
+
+
   double sum = seq->sum();
+  for (uint i = 0; i < indent; i++) gclog_or_tty->print(" ");
   gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)",
                          str, sum / 1000.0, seq->avg());
-}
-
-void ShenandoahCollectorPolicy::print_summary_sd(const char* str, const NumberSeq* seq) {
-  print_summary(str, seq);
+  for (uint i = 0; i < indent; i++) gclog_or_tty->print(" ");
   gclog_or_tty->print_cr("(num = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
                          seq->num(), seq->sd(), seq->maximum());
 }
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.hpp	Wed Feb 11 23:46:45 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahCollectorPolicy.hpp	Thu Feb 12 17:33:38 2015 +0100
@@ -19,6 +19,14 @@
   enum TimingPhase {
     init_mark,
     final_mark,
+      rescan_roots,
+      drain_satb,
+      drain_overflow,
+      drain_queues,
+      weakrefs,
+      prepare_evac,
+      init_evac,
+
     final_evac,
     final_uprefs,
       update_roots,
@@ -43,6 +51,8 @@
   TimingData _timing_data[_num_phases];
   const char* _phase_names[_num_phases];
 
+  size_t _user_requested_gcs;
+
   ShenandoahHeap* _pgc;
   ShenandoahHeuristics* _heuristics;
 
@@ -70,6 +80,8 @@
   void record_phase_start(TimingPhase phase);
   void record_phase_end(TimingPhase phase);
 
+  void record_user_requested_gc();
+
   void record_bytes_allocated(size_t bytes);
   void record_bytes_reclaimed(size_t bytes);
   bool should_start_concurrent_mark(size_t used, size_t capacity);
@@ -80,8 +92,7 @@
   void print_tracing_info();
 
 private:
-  void print_summary(const char* str, const NumberSeq* seq);
-  void print_summary_sd(const char* str, const NumberSeq* seq);
+  void print_summary_sd(const char* str, uint indent, const NumberSeq* seq);
 };
 
 
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahConcurrentMark.cpp	Wed Feb 11 23:46:45 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahConcurrentMark.cpp	Thu Feb 12 17:33:38 2015 +0100
@@ -440,19 +440,30 @@
 
   // Trace any (new) unmarked root references.
   if (! full_gc) {
+    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::rescan_roots);
     prepare_unmarked_root_objs();
+    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::rescan_roots);
   }
 
   {
+    if (! full_gc) {
+      sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::drain_satb);
+    }
     ParallelTaskTerminator terminator(_max_worker_id, _task_queues);
     ShenandoahHeap::StrongRootsScope srs(sh);
     // drain_satb_buffers(0, true);
     FinishDrainSATBBuffersTask drain_satb_buffers(this, &terminator);
     sh->workers()->set_active_workers(_max_worker_id);
     sh->workers()->run_task(&drain_satb_buffers);
+    if (! full_gc) {
+      sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::drain_satb);
+    }
   }
 
   // Also drain our overflow queue.
+  if (! full_gc) {
+    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::drain_overflow);
+  }
   ShenandoahMarkRefsClosure cl1(0);
   ShenandoahMarkRefsNoUpdateClosure cl2(0);
   ExtendedOopClosure* cl;
@@ -467,13 +478,22 @@
     obj->oop_iterate(cl);
     obj = _overflow_queue->pop();
   }
+  if (! full_gc) {
+    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::drain_overflow);
+  }
 
   // Finally mark everything else we've got in our queues during the previous steps.
   {
+    if (! full_gc) {
+      sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::drain_queues);
+    }
     ParallelTaskTerminator terminator(_max_worker_id, _task_queues);
     SCMConcurrentMarkingTask markingTask = SCMConcurrentMarkingTask(this, &terminator, !ShenandoahUpdateRefsEarly);
     sh->workers()->set_active_workers(_max_worker_id);
     sh->workers()->run_task(&markingTask);
+    if (! full_gc) {
+      sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::drain_queues);
+    }
   }
 
 #ifdef ASSERT
@@ -483,7 +503,13 @@
 #endif
 
   // When we're done marking everything, we process weak references.
+  if (! full_gc) {
+    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::weakrefs);
+  }
   weak_refs_work();
+  if (! full_gc) {
+    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::weakrefs);
+  }
 
 #ifdef ASSERT
   for (int i = 0; i < sh->max_workers(); i++) {
--- a/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Wed Feb 11 23:46:45 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/shenandoahHeap.cpp	Thu Feb 12 17:33:38 2015 +0100
@@ -1547,6 +1547,7 @@
       if (ShenandoahTraceFullGC) {
         gclog_or_tty->print_cr("Shenandoah-full-gc: requested full GC");
       }
+      shenandoahPolicy()->record_user_requested_gc();
       _concurrent_gc_thread->do_full_gc();
     }
   } else if (cause == GCCause::_allocation_failure) {
--- a/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp	Wed Feb 11 23:46:45 2015 +0100
+++ b/src/share/vm/gc_implementation/shenandoah/vm_operations_shenandoah.cpp	Thu Feb 12 17:33:38 2015 +0100
@@ -103,17 +103,21 @@
   sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::final_mark);
   sh->concurrentMark()->finish_mark_from_roots();
   sh->stop_concurrent_marking();
-  sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::final_mark);
 
+  sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::prepare_evac);
   sh->prepare_for_concurrent_evacuation();
   sh->set_evacuation_in_progress(true);
+  sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::prepare_evac);
 
   if (! ShenandoahConcurrentEvacuation) {
     VM_ShenandoahEvacuation evacuation;
     evacuation.doit();
   } else {
+    sh->shenandoahPolicy()->record_phase_start(ShenandoahCollectorPolicy::init_evac);
     sh->evacuate_and_update_roots();
+    sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::init_evac);
   }
+  sh->shenandoahPolicy()->record_phase_end(ShenandoahCollectorPolicy::final_mark);
 }
 
 VM_Operation::VMOp_Type VM_ShenandoahStartEvacuation::type() const {