Mercurial > hg > graal-compiler
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 } |