1.1 --- a/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp Thu Aug 15 10:05:50 2013 +0200 1.2 +++ b/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp Thu Aug 15 10:52:18 2013 +0200 1.3 @@ -127,32 +127,55 @@ 1.4 1.5 class HRRSStatsIter: public HeapRegionClosure { 1.6 size_t _occupied; 1.7 - size_t _total_mem_sz; 1.8 - size_t _max_mem_sz; 1.9 - HeapRegion* _max_mem_sz_region; 1.10 + 1.11 + size_t _total_rs_mem_sz; 1.12 + size_t _max_rs_mem_sz; 1.13 + HeapRegion* _max_rs_mem_sz_region; 1.14 + 1.15 + size_t _total_code_root_mem_sz; 1.16 + size_t _max_code_root_mem_sz; 1.17 + HeapRegion* _max_code_root_mem_sz_region; 1.18 public: 1.19 HRRSStatsIter() : 1.20 _occupied(0), 1.21 - _total_mem_sz(0), 1.22 - _max_mem_sz(0), 1.23 - _max_mem_sz_region(NULL) 1.24 + _total_rs_mem_sz(0), 1.25 + _max_rs_mem_sz(0), 1.26 + _max_rs_mem_sz_region(NULL), 1.27 + _total_code_root_mem_sz(0), 1.28 + _max_code_root_mem_sz(0), 1.29 + _max_code_root_mem_sz_region(NULL) 1.30 {} 1.31 1.32 bool doHeapRegion(HeapRegion* r) { 1.33 - size_t mem_sz = r->rem_set()->mem_size(); 1.34 - if (mem_sz > _max_mem_sz) { 1.35 - _max_mem_sz = mem_sz; 1.36 - _max_mem_sz_region = r; 1.37 + HeapRegionRemSet* hrrs = r->rem_set(); 1.38 + 1.39 + // HeapRegionRemSet::mem_size() includes the 1.40 + // size of the strong code roots 1.41 + size_t rs_mem_sz = hrrs->mem_size(); 1.42 + if (rs_mem_sz > _max_rs_mem_sz) { 1.43 + _max_rs_mem_sz = rs_mem_sz; 1.44 + _max_rs_mem_sz_region = r; 1.45 } 1.46 - _total_mem_sz += mem_sz; 1.47 - size_t occ = r->rem_set()->occupied(); 1.48 + _total_rs_mem_sz += rs_mem_sz; 1.49 + 1.50 + size_t code_root_mem_sz = hrrs->strong_code_roots_mem_size(); 1.51 + if (code_root_mem_sz > _max_code_root_mem_sz) { 1.52 + _max_code_root_mem_sz = code_root_mem_sz; 1.53 + _max_code_root_mem_sz_region = r; 1.54 + } 1.55 + _total_code_root_mem_sz += code_root_mem_sz; 1.56 + 1.57 + size_t occ = hrrs->occupied(); 1.58 _occupied += occ; 1.59 return false; 1.60 } 1.61 - size_t total_mem_sz() { return _total_mem_sz; } 1.62 - size_t max_mem_sz() { return _max_mem_sz; } 1.63 + size_t total_rs_mem_sz() { return _total_rs_mem_sz; } 1.64 + size_t max_rs_mem_sz() { return _max_rs_mem_sz; } 1.65 + HeapRegion* max_rs_mem_sz_region() { return _max_rs_mem_sz_region; } 1.66 + size_t total_code_root_mem_sz() { return _total_code_root_mem_sz; } 1.67 + size_t max_code_root_mem_sz() { return _max_code_root_mem_sz; } 1.68 + HeapRegion* max_code_root_mem_sz_region() { return _max_code_root_mem_sz_region; } 1.69 size_t occupied() { return _occupied; } 1.70 - HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; } 1.71 }; 1.72 1.73 double calc_percentage(size_t numerator, size_t denominator) { 1.74 @@ -184,22 +207,33 @@ 1.75 1.76 HRRSStatsIter blk; 1.77 G1CollectedHeap::heap()->heap_region_iterate(&blk); 1.78 + // RemSet stats 1.79 out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K." 1.80 " Max = "SIZE_FORMAT"K.", 1.81 - blk.total_mem_sz()/K, blk.max_mem_sz()/K); 1.82 + blk.total_rs_mem_sz()/K, blk.max_rs_mem_sz()/K); 1.83 out->print_cr(" Static structures = "SIZE_FORMAT"K," 1.84 " free_lists = "SIZE_FORMAT"K.", 1.85 HeapRegionRemSet::static_mem_size() / K, 1.86 HeapRegionRemSet::fl_mem_size() / K); 1.87 out->print_cr(" "SIZE_FORMAT" occupied cards represented.", 1.88 blk.occupied()); 1.89 - HeapRegion* max_mem_sz_region = blk.max_mem_sz_region(); 1.90 - HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set(); 1.91 + HeapRegion* max_rs_mem_sz_region = blk.max_rs_mem_sz_region(); 1.92 + HeapRegionRemSet* max_rs_rem_set = max_rs_mem_sz_region->rem_set(); 1.93 out->print_cr(" Max size region = "HR_FORMAT", " 1.94 "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.", 1.95 - HR_FORMAT_PARAMS(max_mem_sz_region), 1.96 - (rem_set->mem_size() + K - 1)/K, 1.97 - (rem_set->occupied() + K - 1)/K); 1.98 - 1.99 + HR_FORMAT_PARAMS(max_rs_mem_sz_region), 1.100 + (max_rs_rem_set->mem_size() + K - 1)/K, 1.101 + (max_rs_rem_set->occupied() + K - 1)/K); 1.102 out->print_cr(" Did %d coarsenings.", num_coarsenings()); 1.103 + // Strong code root stats 1.104 + out->print_cr(" Total heap region code-root set sizes = "SIZE_FORMAT"K." 1.105 + " Max = "SIZE_FORMAT"K.", 1.106 + blk.total_code_root_mem_sz()/K, blk.max_code_root_mem_sz()/K); 1.107 + HeapRegion* max_code_root_mem_sz_region = blk.max_code_root_mem_sz_region(); 1.108 + HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region->rem_set(); 1.109 + out->print_cr(" Max size region = "HR_FORMAT", " 1.110 + "size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".", 1.111 + HR_FORMAT_PARAMS(max_code_root_mem_sz_region), 1.112 + (max_code_root_rem_set->strong_code_roots_mem_size() + K - 1)/K, 1.113 + (max_code_root_rem_set->strong_code_roots_list_length())); 1.114 }