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

Print this page
rev 4735 : [mq]: 8013895
rev 4736 : Add per-region type information to the output of -XX:+G1SummarizeRSetStats

@@ -124,37 +124,148 @@
 
   _sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime;
 }
 
 class HRRSStatsIter: public HeapRegionClosure {
-  size_t _occupied;
-  size_t _total_mem_sz;
+private:
   size_t _max_mem_sz;
   HeapRegion* _max_mem_sz_region;
+
+  struct region_type_counter_t {
+  private:
+    size_t _mem_size;
+    size_t _occupied;
+    size_t _amount;
+
+    static double percent_of(size_t* value, size_t total) {
+      if (total != 0) {
+        return ((double)*value / total) * 100.0f;
+      } else {
+        return 0.0f;
+      }
+    }
+
+    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:
+
+    region_type_counter_t() : _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);
+    }
+  };
+
+  region_type_counter_t _young;
+  region_type_counter_t _humonguous;
+  region_type_counter_t _free;
+  region_type_counter_t _other;
+  region_type_counter_t _all;
+
+  region_type_counter_t& young() {
+    return _young;
+  }
+
+  region_type_counter_t& humonguous() {
+    return _humonguous;
+  }
+
+  region_type_counter_t& free() {
+    return _free;
+  }
+
+  region_type_counter_t& other() {
+    return _other;
+  }
+
+  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)
+    _max_mem_sz(0), _max_mem_sz_region(NULL),
+    _all(), _young(), _humonguous(), _free(), _other()
   {}
 
   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 {
+      _other.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; }
+
+  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");
+    other().print_mem_info_on(out, total_mem_sz(), "Other");
+    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");
+    other().print_occupied_info_on(out, occupied(), "Other");
+    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);
+  }
 };
 
 double calc_percentage(size_t numerator, size_t denominator) {
   if (denominator != 0) {
     return (double)numerator / denominator * 100.0;

@@ -182,24 +293,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());
 }