Mercurial > hg > graal-compiler
comparison src/share/vm/services/memReporter.cpp @ 10984:cd2118b62475
8013917: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites
Summary: Simple fix when memory allocation site is gone, NMT should report 0 memory size, instead old memory size.
Reviewed-by: dcubed, ctornqvi
author | zgu |
---|---|
date | Mon, 10 Jun 2013 10:45:19 -0400 |
parents | 3c9db54c2660 |
children | 8cff1de240de |
comparison
equal
deleted
inserted
replaced
10983:abbd5c660b48 | 10984:cd2118b62475 |
---|---|
188 (MallocCallsitePointer*)prev_malloc_itr.current(); | 188 (MallocCallsitePointer*)prev_malloc_itr.current(); |
189 | 189 |
190 while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { | 190 while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { |
191 if (prev_malloc_callsite == NULL || | 191 if (prev_malloc_callsite == NULL || |
192 cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { | 192 cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { |
193 // this is a new callsite | |
193 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | 194 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), |
194 amount_in_current_scale(cur_malloc_callsite->amount()), | 195 amount_in_current_scale(cur_malloc_callsite->amount()), |
195 cur_malloc_callsite->count(), | 196 cur_malloc_callsite->count(), |
196 diff_in_current_scale(cur_malloc_callsite->amount(), 0), | 197 diff_in_current_scale(cur_malloc_callsite->amount(), 0), |
197 diff(cur_malloc_callsite->count(), 0)); | 198 diff(cur_malloc_callsite->count(), 0)); |
198 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); | 199 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); |
199 } else if (prev_malloc_callsite == NULL || | 200 } else if (cur_malloc_callsite == NULL || |
200 cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { | 201 cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { |
201 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | 202 // this callsite is already gone |
202 amount_in_current_scale(prev_malloc_callsite->amount()), | 203 _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), |
203 prev_malloc_callsite->count(), | 204 amount_in_current_scale(0), 0, |
204 diff_in_current_scale(0, prev_malloc_callsite->amount()), | 205 diff_in_current_scale(0, prev_malloc_callsite->amount()), |
205 diff(0, prev_malloc_callsite->count())); | 206 diff(0, prev_malloc_callsite->count())); |
206 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); | 207 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); |
207 } else { // the same callsite | 208 } else { // the same callsite |
208 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), | 209 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), |
220 MemPointerArrayIteratorImpl prev_vm_itr(pBL_prev->_vm_cs); | 221 MemPointerArrayIteratorImpl prev_vm_itr(pBL_prev->_vm_cs); |
221 VMCallsitePointer* cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.current(); | 222 VMCallsitePointer* cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.current(); |
222 VMCallsitePointer* prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.current(); | 223 VMCallsitePointer* prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.current(); |
223 while (cur_vm_callsite != NULL || prev_vm_callsite != NULL) { | 224 while (cur_vm_callsite != NULL || prev_vm_callsite != NULL) { |
224 if (prev_vm_callsite == NULL || cur_vm_callsite->addr() < prev_vm_callsite->addr()) { | 225 if (prev_vm_callsite == NULL || cur_vm_callsite->addr() < prev_vm_callsite->addr()) { |
226 // this is a new callsite | |
225 _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), | 227 _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), |
226 amount_in_current_scale(cur_vm_callsite->reserved_amount()), | 228 amount_in_current_scale(cur_vm_callsite->reserved_amount()), |
227 amount_in_current_scale(cur_vm_callsite->committed_amount()), | 229 amount_in_current_scale(cur_vm_callsite->committed_amount()), |
228 diff_in_current_scale(cur_vm_callsite->reserved_amount(), 0), | 230 diff_in_current_scale(cur_vm_callsite->reserved_amount(), 0), |
229 diff_in_current_scale(cur_vm_callsite->committed_amount(), 0)); | 231 diff_in_current_scale(cur_vm_callsite->committed_amount(), 0)); |
230 cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.next(); | 232 cur_vm_callsite = (VMCallsitePointer*)cur_vm_itr.next(); |
231 } else if (cur_vm_callsite == NULL || cur_vm_callsite->addr() > prev_vm_callsite->addr()) { | 233 } else if (cur_vm_callsite == NULL || cur_vm_callsite->addr() > prev_vm_callsite->addr()) { |
234 // this callsite is already gone | |
232 _outputer.diff_virtual_memory_callsite(prev_vm_callsite->addr(), | 235 _outputer.diff_virtual_memory_callsite(prev_vm_callsite->addr(), |
233 amount_in_current_scale(prev_vm_callsite->reserved_amount()), | 236 amount_in_current_scale(0), |
234 amount_in_current_scale(prev_vm_callsite->committed_amount()), | 237 amount_in_current_scale(0), |
235 diff_in_current_scale(0, prev_vm_callsite->reserved_amount()), | 238 diff_in_current_scale(0, prev_vm_callsite->reserved_amount()), |
236 diff_in_current_scale(0, prev_vm_callsite->committed_amount())); | 239 diff_in_current_scale(0, prev_vm_callsite->committed_amount())); |
237 prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next(); | 240 prev_vm_callsite = (VMCallsitePointer*)prev_vm_itr.next(); |
238 } else { // the same callsite | 241 } else { // the same callsite |
239 _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), | 242 _outputer.diff_virtual_memory_callsite(cur_vm_callsite->addr(), |