src/share/vm/services/memSnapshot.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/services

src/share/vm/services/memSnapshot.cpp

Print this page




 245           return insert_record_after(&tmp);
 246         } else {
 247           MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
 248           return insert_record_after(&tmp);
 249         }
 250       }
 251     }
 252     cur = (VMMemRegion*)next();
 253   }
 254 
 255   // we may not find committed record due to duplicated records
 256   return true;
 257 }
 258 
 259 bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) {
 260   assert(rec->is_deallocation_record(), "Sanity check");
 261   VMMemRegion* cur = (VMMemRegion*)current();
 262   assert(cur->is_reserved_region() && cur->contains_region(rec),
 263     "Sanity check");
 264   if (rec->is_same_region(cur)) {
 265     // release whole reserved region
 266 #ifdef ASSERT
 267     VMMemRegion* next_region = (VMMemRegion*)peek_next();
 268     // should not have any committed memory in this reserved region
 269     assert(next_region == NULL || !next_region->is_committed_region(), "Sanity check");
 270 #endif
 271     remove();









 272   } else if (rec->addr() == cur->addr() ||
 273     rec->addr() + rec->size() == cur->addr() + cur->size()) {
 274     // released region is at either end of this region
 275     cur->exclude_region(rec->addr(), rec->size());
 276     assert(check_reserved_region(), "Integrity check");
 277   } else { // split the reserved region and release the middle
 278     address high_addr = cur->addr() + cur->size();
 279     size_t sz = high_addr - rec->addr();
 280     cur->exclude_region(rec->addr(), sz);
 281     sz = high_addr - rec->addr() - rec->size();
 282     if (MemTracker::track_callsite()) {
 283       MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz,
 284         ((VMMemRegionEx*)cur)->pc());
 285       bool ret = insert_reserved_region(&tmp);
 286       assert(!ret || check_reserved_region(), "Integrity check");
 287       return ret;
 288     } else {
 289       MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
 290       bool ret = insert_reserved_region(&tmp);
 291       assert(!ret || check_reserved_region(), "Integrity check");




 245           return insert_record_after(&tmp);
 246         } else {
 247           MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
 248           return insert_record_after(&tmp);
 249         }
 250       }
 251     }
 252     cur = (VMMemRegion*)next();
 253   }
 254 
 255   // we may not find committed record due to duplicated records
 256   return true;
 257 }
 258 
 259 bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) {
 260   assert(rec->is_deallocation_record(), "Sanity check");
 261   VMMemRegion* cur = (VMMemRegion*)current();
 262   assert(cur->is_reserved_region() && cur->contains_region(rec),
 263     "Sanity check");
 264   if (rec->is_same_region(cur)) {
 265     // release whole reserved region and all committed regions within the reserved region
 266 #ifdef ASSERT
 267     address low_addr = cur->addr();
 268     address high_addr = low_addr + cur->size();

 269 #endif
 270     remove();
 271     // remove committed regions within the reserved region
 272     VMMemRegion* next_region = (VMMemRegion*)current();
 273     while (next_region != NULL && next_region->is_committed_region()) {
 274       assert(next_region->addr() >= low_addr &&
 275              next_region->addr() + next_region->size() <= high_addr,
 276             "Range check");
 277       remove();
 278       next_region = (VMMemRegion*)current();
 279     }
 280   } else if (rec->addr() == cur->addr() ||
 281     rec->addr() + rec->size() == cur->addr() + cur->size()) {
 282     // released region is at either end of this region
 283     cur->exclude_region(rec->addr(), rec->size());
 284     assert(check_reserved_region(), "Integrity check");
 285   } else { // split the reserved region and release the middle
 286     address high_addr = cur->addr() + cur->size();
 287     size_t sz = high_addr - rec->addr();
 288     cur->exclude_region(rec->addr(), sz);
 289     sz = high_addr - rec->addr() - rec->size();
 290     if (MemTracker::track_callsite()) {
 291       MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz,
 292         ((VMMemRegionEx*)cur)->pc());
 293       bool ret = insert_reserved_region(&tmp);
 294       assert(!ret || check_reserved_region(), "Integrity check");
 295       return ret;
 296     } else {
 297       MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
 298       bool ret = insert_reserved_region(&tmp);
 299       assert(!ret || check_reserved_region(), "Integrity check");


src/share/vm/services/memSnapshot.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File