src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp
Print this page
rev 4654 : [mq]: 8013895
rev 4655 : [mq]: 8014078
@@ -124,36 +124,122 @@
_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;
public:
+ 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);
+ }
+ };
+
+private:
+ 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;
+
+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; }
+
+ 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 _occupied; }
+ size_t occupied() { return _all.occupied(); }
HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
};
double calc_percentage(size_t numerator, size_t denominator) {
if (denominator != 0) {
@@ -185,16 +271,24 @@
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);
+ blk.young().print_mem_info_on(out, blk.total_mem_sz(), "Young");
+ blk.humonguous().print_mem_info_on(out, blk.total_mem_sz(), "Humonguous");
+ blk.free().print_mem_info_on(out, blk.total_mem_sz(), "Free");
+ blk.other().print_mem_info_on(out, blk.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.",
blk.occupied());
+ blk.young().print_occupied_info_on(out, blk.occupied(), "Young");
+ blk.humonguous().print_occupied_info_on(out, blk.occupied(), "Humonguous");
+ blk.free().print_occupied_info_on(out, blk.occupied(), "Free");
+ blk.other().print_occupied_info_on(out, blk.occupied(), "Other");
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),