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(),