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

Print this page

        

@@ -123,58 +123,139 @@
   }
 
   _sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime;
 }
 
-class HRRSStatsIter: public HeapRegionClosure {
+double percent_of(size_t numerator, size_t denominator) {
+  if (denominator != 0) {
+    return (double)numerator / denominator * 100.0f;
+  } else {
+    return 0.0f;
+  }
+}
+
+class RegionTypeCounter VALUE_OBJ_CLASS_SPEC {
+private:
+  size_t _mem_size;
   size_t _occupied;
-  size_t _total_mem_sz;
+  size_t _amount;
+
+  double mem_size_percent_of(size_t total) {
+    return percent_of(_mem_size, total);
+  }
+
+  double occupied_percent_of(size_t total) {
+    return percent_of(_occupied, total);
+  }
+
+  size_t amount() const { return _amount; }
+
+public:
+
+  RegionTypeCounter() : _mem_size(0), _occupied(0), _amount(0) { }
+
+  void add(size_t mem_size, size_t occupied) {
+    _mem_size += mem_size;
+    _occupied += occupied;
+    _amount++;
+  }
+
+  size_t mem_size() const { return _mem_size; }
+  size_t occupied() const { return _occupied; }
+
+  void print_mem_info_on(outputStream * out, size_t total, char const * type) {
+    out->print_cr("    %8dK (%5.1f%%) by %zd %s regions", mem_size()/K, mem_size_percent_of(total), amount(), type);
+  }
+
+  void print_occupied_info_on(outputStream * out, size_t total, char const * type) {
+    out->print_cr("     %8d (%5.1f%%) entries by %zd %s regions", occupied(), occupied_percent_of(total), amount(), type);
+  }
+};
+
+
+class HRRSStatsIter: public HeapRegionClosure {
+private:
   size_t _max_mem_sz;
   HeapRegion* _max_mem_sz_region;
+
+  RegionTypeCounter _young;
+  RegionTypeCounter _humonguous;
+  RegionTypeCounter _free;
+  RegionTypeCounter _old;
+  RegionTypeCounter _all;
+
+  size_t total_mem_sz()           { return _all.mem_size(); }
+  size_t max_mem_sz()             { return _max_mem_sz; }
+  size_t occupied()               { return _all.occupied(); }
+  HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
+
 public:
-  HRRSStatsIter() :
-    _occupied(0),
-    _total_mem_sz(0),
-    _max_mem_sz(0),
-    _max_mem_sz_region(NULL)
+  HRRSStatsIter() : _max_mem_sz(0), _max_mem_sz_region(NULL),
+    _all(), _young(), _humonguous(), _free(), _old()
   {}
 
   bool doHeapRegion(HeapRegion* r) {
     size_t mem_sz = r->rem_set()->mem_size();
     if (mem_sz > _max_mem_sz) {
       _max_mem_sz = mem_sz;
       _max_mem_sz_region = r;
     }
-    _total_mem_sz += mem_sz;
     size_t occ = r->rem_set()->occupied();
-    _occupied += occ;
+
+    _all.add(mem_sz, occ);
+    if (r->is_young()) {
+      _young.add(mem_sz, occ);
+    } else if (r->isHumongous()) {
+      _humonguous.add(mem_sz, occ);
+    } else if (r->is_empty()) {
+      _free.add(mem_sz, occ);
+    } else {
+      _old.add(mem_sz, occ);
+    }
+
     return false;
   }
-  size_t total_mem_sz() { return _total_mem_sz; }
-  size_t max_mem_sz() { return _max_mem_sz; }
-  size_t occupied() { return _occupied; }
-  HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
-};
 
-double calc_percentage(size_t numerator, size_t denominator) {
-  if (denominator != 0) {
-    return (double)numerator / denominator * 100.0;
-  } else {
-    return 0.0f;
+  void print_summary_on(outputStream* out) {
+    out->print_cr("  Total heap region rem set sizes = "SIZE_FORMAT"K."
+                  "  Max = "SIZE_FORMAT"K.",
+                  total_mem_sz() / K, max_mem_sz() / K);
+    _young.print_mem_info_on(out, total_mem_sz(), "Young");
+    _humonguous.print_mem_info_on(out, total_mem_sz(), "Humonguous");
+    _free.print_mem_info_on(out, total_mem_sz(), "Free");
+    _old.print_mem_info_on(out, total_mem_sz(), "Old");
+    out->print_cr("  Static structures = "SIZE_FORMAT"K,"
+                  " free_lists = "SIZE_FORMAT"K.",
+                  HeapRegionRemSet::static_mem_size() / K,
+                  HeapRegionRemSet::fl_mem_size() / K);
+
+    out->print_cr("    "SIZE_FORMAT" occupied cards represented.",
+                  occupied());
+    _young.print_occupied_info_on(out, occupied(), "Young");
+    _humonguous.print_occupied_info_on(out, occupied(), "Humonguous");
+    _free.print_occupied_info_on(out, occupied(), "Free");
+    _old.print_occupied_info_on(out, occupied(), "Old");
+
+    HeapRegionRemSet* rem_set = max_mem_sz_region()->rem_set();
+    out->print_cr("    Max size region = "HR_FORMAT", "
+                  "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
+                  HR_FORMAT_PARAMS(max_mem_sz_region()),
+                  (rem_set->mem_size() + K - 1) / K,
+                  (rem_set->occupied() + K - 1) / K);
   }
-}
+};
 
 void G1RemSetSummary::print_on(outputStream* out) {
   out->print_cr("\n Concurrent RS processed "SIZE_FORMAT" cards",
                 num_concurrent_refined_cards());
   out->print_cr("  Of %d completed buffers:", num_processed_buf_total());
   out->print_cr("     %8d (%5.1f%%) by concurrent RS threads.",
                 num_processed_buf_total(),
-                calc_percentage(num_processed_buf_rs_threads(), num_processed_buf_total()));
+                percent_of(num_processed_buf_rs_threads(), num_processed_buf_total()));
   out->print_cr("     %8d (%5.1f%%) by mutator threads.",
                 num_processed_buf_mutator(),
-                calc_percentage(num_processed_buf_mutator(), num_processed_buf_total()));
+                percent_of(num_processed_buf_mutator(), num_processed_buf_total()));
   out->print_cr("  Concurrent RS threads times (s)");
   out->print("     ");
   for (uint i = 0; i < _num_vtimes; i++) {
     out->print("    %5.2f", rs_thread_vtime(i));
   }

@@ -182,24 +263,9 @@
   out->print_cr("  Concurrent sampling threads times (s)");
   out->print_cr("         %5.2f", sampling_thread_vtime());
 
   HRRSStatsIter blk;
   G1CollectedHeap::heap()->heap_region_iterate(&blk);
-  out->print_cr("  Total heap region rem set sizes = "SIZE_FORMAT"K."
-                "  Max = "SIZE_FORMAT"K.",
-                blk.total_mem_sz()/K, blk.max_mem_sz()/K);
-  out->print_cr("  Static structures = "SIZE_FORMAT"K,"
-                " free_lists = "SIZE_FORMAT"K.",
-                HeapRegionRemSet::static_mem_size() / K,
-                HeapRegionRemSet::fl_mem_size() / K);
-  out->print_cr("    "SIZE_FORMAT" occupied cards represented.",
-                blk.occupied());
-  HeapRegion* max_mem_sz_region = blk.max_mem_sz_region();
-  HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
-  out->print_cr("    Max size region = "HR_FORMAT", "
-                "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
-                HR_FORMAT_PARAMS(max_mem_sz_region),
-                (rem_set->mem_size() + K - 1)/K,
-                (rem_set->occupied() + K - 1)/K);
+  blk.print_summary_on(out);
 
   out->print_cr("    Did %d coarsenings.", num_coarsenings());
 }