--- old/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp 2013-05-28 10:04:31.968576437 +0200 +++ new/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp 2013-05-28 10:04:31.448576450 +0200 @@ -126,16 +126,95 @@ } 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) { @@ -144,15 +223,47 @@ _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) { @@ -184,22 +295,7 @@ 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()); }