comparison src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp @ 12080:5888334c9c24

7145569: G1: optimize nmethods scanning Summary: Add a list of nmethods to the RSet for a region that contain references into the region. Skip scanning the code cache during root scanning and scan the nmethod lists during RSet scanning instead. Reviewed-by: tschatzl, brutisso, mgerdin, twisti, kvn
author johnc
date Thu, 15 Aug 2013 10:52:18 +0200
parents e72f7eecc96d
children c319b188c7b2
comparison
equal deleted inserted replaced
12033:bd902affe102 12080:5888334c9c24
125 _sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime; 125 _sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime;
126 } 126 }
127 127
128 class HRRSStatsIter: public HeapRegionClosure { 128 class HRRSStatsIter: public HeapRegionClosure {
129 size_t _occupied; 129 size_t _occupied;
130 size_t _total_mem_sz; 130
131 size_t _max_mem_sz; 131 size_t _total_rs_mem_sz;
132 HeapRegion* _max_mem_sz_region; 132 size_t _max_rs_mem_sz;
133 HeapRegion* _max_rs_mem_sz_region;
134
135 size_t _total_code_root_mem_sz;
136 size_t _max_code_root_mem_sz;
137 HeapRegion* _max_code_root_mem_sz_region;
133 public: 138 public:
134 HRRSStatsIter() : 139 HRRSStatsIter() :
135 _occupied(0), 140 _occupied(0),
136 _total_mem_sz(0), 141 _total_rs_mem_sz(0),
137 _max_mem_sz(0), 142 _max_rs_mem_sz(0),
138 _max_mem_sz_region(NULL) 143 _max_rs_mem_sz_region(NULL),
144 _total_code_root_mem_sz(0),
145 _max_code_root_mem_sz(0),
146 _max_code_root_mem_sz_region(NULL)
139 {} 147 {}
140 148
141 bool doHeapRegion(HeapRegion* r) { 149 bool doHeapRegion(HeapRegion* r) {
142 size_t mem_sz = r->rem_set()->mem_size(); 150 HeapRegionRemSet* hrrs = r->rem_set();
143 if (mem_sz > _max_mem_sz) { 151
144 _max_mem_sz = mem_sz; 152 // HeapRegionRemSet::mem_size() includes the
145 _max_mem_sz_region = r; 153 // size of the strong code roots
154 size_t rs_mem_sz = hrrs->mem_size();
155 if (rs_mem_sz > _max_rs_mem_sz) {
156 _max_rs_mem_sz = rs_mem_sz;
157 _max_rs_mem_sz_region = r;
146 } 158 }
147 _total_mem_sz += mem_sz; 159 _total_rs_mem_sz += rs_mem_sz;
148 size_t occ = r->rem_set()->occupied(); 160
161 size_t code_root_mem_sz = hrrs->strong_code_roots_mem_size();
162 if (code_root_mem_sz > _max_code_root_mem_sz) {
163 _max_code_root_mem_sz = code_root_mem_sz;
164 _max_code_root_mem_sz_region = r;
165 }
166 _total_code_root_mem_sz += code_root_mem_sz;
167
168 size_t occ = hrrs->occupied();
149 _occupied += occ; 169 _occupied += occ;
150 return false; 170 return false;
151 } 171 }
152 size_t total_mem_sz() { return _total_mem_sz; } 172 size_t total_rs_mem_sz() { return _total_rs_mem_sz; }
153 size_t max_mem_sz() { return _max_mem_sz; } 173 size_t max_rs_mem_sz() { return _max_rs_mem_sz; }
174 HeapRegion* max_rs_mem_sz_region() { return _max_rs_mem_sz_region; }
175 size_t total_code_root_mem_sz() { return _total_code_root_mem_sz; }
176 size_t max_code_root_mem_sz() { return _max_code_root_mem_sz; }
177 HeapRegion* max_code_root_mem_sz_region() { return _max_code_root_mem_sz_region; }
154 size_t occupied() { return _occupied; } 178 size_t occupied() { return _occupied; }
155 HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
156 }; 179 };
157 180
158 double calc_percentage(size_t numerator, size_t denominator) { 181 double calc_percentage(size_t numerator, size_t denominator) {
159 if (denominator != 0) { 182 if (denominator != 0) {
160 return (double)numerator / denominator * 100.0; 183 return (double)numerator / denominator * 100.0;
182 out->print_cr(" Concurrent sampling threads times (s)"); 205 out->print_cr(" Concurrent sampling threads times (s)");
183 out->print_cr(" %5.2f", sampling_thread_vtime()); 206 out->print_cr(" %5.2f", sampling_thread_vtime());
184 207
185 HRRSStatsIter blk; 208 HRRSStatsIter blk;
186 G1CollectedHeap::heap()->heap_region_iterate(&blk); 209 G1CollectedHeap::heap()->heap_region_iterate(&blk);
210 // RemSet stats
187 out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K." 211 out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
188 " Max = "SIZE_FORMAT"K.", 212 " Max = "SIZE_FORMAT"K.",
189 blk.total_mem_sz()/K, blk.max_mem_sz()/K); 213 blk.total_rs_mem_sz()/K, blk.max_rs_mem_sz()/K);
190 out->print_cr(" Static structures = "SIZE_FORMAT"K," 214 out->print_cr(" Static structures = "SIZE_FORMAT"K,"
191 " free_lists = "SIZE_FORMAT"K.", 215 " free_lists = "SIZE_FORMAT"K.",
192 HeapRegionRemSet::static_mem_size() / K, 216 HeapRegionRemSet::static_mem_size() / K,
193 HeapRegionRemSet::fl_mem_size() / K); 217 HeapRegionRemSet::fl_mem_size() / K);
194 out->print_cr(" "SIZE_FORMAT" occupied cards represented.", 218 out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
195 blk.occupied()); 219 blk.occupied());
196 HeapRegion* max_mem_sz_region = blk.max_mem_sz_region(); 220 HeapRegion* max_rs_mem_sz_region = blk.max_rs_mem_sz_region();
197 HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set(); 221 HeapRegionRemSet* max_rs_rem_set = max_rs_mem_sz_region->rem_set();
198 out->print_cr(" Max size region = "HR_FORMAT", " 222 out->print_cr(" Max size region = "HR_FORMAT", "
199 "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.", 223 "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
200 HR_FORMAT_PARAMS(max_mem_sz_region), 224 HR_FORMAT_PARAMS(max_rs_mem_sz_region),
201 (rem_set->mem_size() + K - 1)/K, 225 (max_rs_rem_set->mem_size() + K - 1)/K,
202 (rem_set->occupied() + K - 1)/K); 226 (max_rs_rem_set->occupied() + K - 1)/K);
203
204 out->print_cr(" Did %d coarsenings.", num_coarsenings()); 227 out->print_cr(" Did %d coarsenings.", num_coarsenings());
205 } 228 // Strong code root stats
229 out->print_cr(" Total heap region code-root set sizes = "SIZE_FORMAT"K."
230 " Max = "SIZE_FORMAT"K.",
231 blk.total_code_root_mem_sz()/K, blk.max_code_root_mem_sz()/K);
232 HeapRegion* max_code_root_mem_sz_region = blk.max_code_root_mem_sz_region();
233 HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region->rem_set();
234 out->print_cr(" Max size region = "HR_FORMAT", "
235 "size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".",
236 HR_FORMAT_PARAMS(max_code_root_mem_sz_region),
237 (max_code_root_rem_set->strong_code_roots_mem_size() + K - 1)/K,
238 (max_code_root_rem_set->strong_code_roots_list_length()));
239 }