320 reserved_rgn->set_call_stack(stack); 321 return true; 322 } else { 323 // Overlapped reservation. 324 // It can happen when the regions are thread stacks, as JNI 325 // thread does not detach from VM before exits, and leads to 326 // leak JavaThread object 327 if (reserved_rgn->flag() == mtThreadStack) { 328 guarantee(!CheckJNICalls, "Attached JNI thread exited without being detached"); 329 // Overwrite with new region 330 331 // Release old region 332 VirtualMemorySummary::record_uncommitted_memory(reserved_rgn->committed_size(), reserved_rgn->flag()); 333 VirtualMemorySummary::record_released_memory(reserved_rgn->size(), reserved_rgn->flag()); 334 335 // Add new region 336 VirtualMemorySummary::record_reserved_memory(rgn.size(), flag); 337 338 *reserved_rgn = rgn; 339 return true; 340 } else { 341 ShouldNotReachHere(); 342 return false; 343 } 344 } 345 } 346 } 347 348 void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) { 349 assert(addr != NULL, "Invalid address"); 350 assert(_reserved_regions != NULL, "Sanity check"); 351 352 ReservedMemoryRegion rgn(addr, 1); 353 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 354 if (reserved_rgn != NULL) { 355 assert(reserved_rgn->contain_address(addr), "Containment"); 356 if (reserved_rgn->flag() != flag) { 357 assert(reserved_rgn->flag() == mtNone, "Overwrite memory type"); 358 reserved_rgn->set_flag(flag); 359 } 360 } 361 } 362 363 bool VirtualMemoryTracker::add_committed_region(address addr, size_t size, 364 const NativeCallStack& stack) { 365 assert(addr != NULL, "Invalid address"); | 320 reserved_rgn->set_call_stack(stack); 321 return true; 322 } else { 323 // Overlapped reservation. 324 // It can happen when the regions are thread stacks, as JNI 325 // thread does not detach from VM before exits, and leads to 326 // leak JavaThread object 327 if (reserved_rgn->flag() == mtThreadStack) { 328 guarantee(!CheckJNICalls, "Attached JNI thread exited without being detached"); 329 // Overwrite with new region 330 331 // Release old region 332 VirtualMemorySummary::record_uncommitted_memory(reserved_rgn->committed_size(), reserved_rgn->flag()); 333 VirtualMemorySummary::record_released_memory(reserved_rgn->size(), reserved_rgn->flag()); 334 335 // Add new region 336 VirtualMemorySummary::record_reserved_memory(rgn.size(), flag); 337 338 *reserved_rgn = rgn; 339 return true; 340 } 341 342 // CDS mapping region. 343 // CDS reserves the whole region for mapping CDS archive, then maps each section into the region. 344 // NMT reports CDS as a whole. 345 if (reserved_rgn->flag() == mtClassShared) { 346 assert(reserved_rgn->contain_region(base_addr, size), "Reserved CDS region should contain this mapping region"); 347 return true; 348 } 349 350 ShouldNotReachHere(); 351 return false; 352 } 353 } 354 } 355 356 void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) { 357 assert(addr != NULL, "Invalid address"); 358 assert(_reserved_regions != NULL, "Sanity check"); 359 360 ReservedMemoryRegion rgn(addr, 1); 361 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn); 362 if (reserved_rgn != NULL) { 363 assert(reserved_rgn->contain_address(addr), "Containment"); 364 if (reserved_rgn->flag() != flag) { 365 assert(reserved_rgn->flag() == mtNone, "Overwrite memory type"); 366 reserved_rgn->set_flag(flag); 367 } 368 } 369 } 370 371 bool VirtualMemoryTracker::add_committed_region(address addr, size_t size, 372 const NativeCallStack& stack) { 373 assert(addr != NULL, "Invalid address"); |