src/os/linux/vm/os_linux.cpp

changeset 7074
833b0f92429a
parent 6918
d22136881b85
child 7089
6e0cb14ce59b
equal deleted inserted replaced
7073:4d3a43351904 7074:833b0f92429a
3499 return NULL; 3499 return NULL;
3500 } 3500 }
3501 3501
3502 assert(is_ptr_aligned(start, alignment), "Must be"); 3502 assert(is_ptr_aligned(start, alignment), "Must be");
3503 3503
3504 // os::reserve_memory_special will record this memory area. 3504 if (MemTracker::tracking_level() > NMT_minimal) {
3505 // Need to release it here to prevent overlapping reservations. 3505 // os::reserve_memory_special will record this memory area.
3506 MemTracker::record_virtual_memory_release((address)start, bytes); 3506 // Need to release it here to prevent overlapping reservations.
3507 Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
3508 tkr.record((address)start, bytes);
3509 }
3507 3510
3508 char* end = start + bytes; 3511 char* end = start + bytes;
3509 3512
3510 // Find the regions of the allocated chunk that can be promoted to large pages. 3513 // Find the regions of the allocated chunk that can be promoted to large pages.
3511 char* lp_start = (char*)align_ptr_up(start, large_page_size); 3514 char* lp_start = (char*)align_ptr_up(start, large_page_size);
3596 if (UseNUMAInterleaving) { 3599 if (UseNUMAInterleaving) {
3597 numa_make_global(addr, bytes); 3600 numa_make_global(addr, bytes);
3598 } 3601 }
3599 3602
3600 // The memory is committed 3603 // The memory is committed
3601 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC); 3604 MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC);
3602 } 3605 }
3603 3606
3604 return addr; 3607 return addr;
3605 } 3608 }
3606 3609
3612 bool os::Linux::release_memory_special_huge_tlbfs(char* base, size_t bytes) { 3615 bool os::Linux::release_memory_special_huge_tlbfs(char* base, size_t bytes) {
3613 return pd_release_memory(base, bytes); 3616 return pd_release_memory(base, bytes);
3614 } 3617 }
3615 3618
3616 bool os::release_memory_special(char* base, size_t bytes) { 3619 bool os::release_memory_special(char* base, size_t bytes) {
3620 bool res;
3621 if (MemTracker::tracking_level() > NMT_minimal) {
3622 Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
3623 res = os::Linux::release_memory_special_impl(base, bytes);
3624 if (res) {
3625 tkr.record((address)base, bytes);
3626 }
3627
3628 } else {
3629 res = os::Linux::release_memory_special_impl(base, bytes);
3630 }
3631 return res;
3632 }
3633
3634 bool os::Linux::release_memory_special_impl(char* base, size_t bytes) {
3617 assert(UseLargePages, "only for large pages"); 3635 assert(UseLargePages, "only for large pages");
3618
3619 MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
3620
3621 bool res; 3636 bool res;
3637
3622 if (UseSHM) { 3638 if (UseSHM) {
3623 res = os::Linux::release_memory_special_shm(base, bytes); 3639 res = os::Linux::release_memory_special_shm(base, bytes);
3624 } else { 3640 } else {
3625 assert(UseHugeTLBFS, "must be"); 3641 assert(UseHugeTLBFS, "must be");
3626 res = os::Linux::release_memory_special_huge_tlbfs(base, bytes); 3642 res = os::Linux::release_memory_special_huge_tlbfs(base, bytes);
3627 } 3643 }
3628
3629 if (res) {
3630 tkr.record((address)base, bytes);
3631 } else {
3632 tkr.discard();
3633 }
3634
3635 return res; 3644 return res;
3636 } 3645 }
3637 3646
3638 size_t os::large_page_size() { 3647 size_t os::large_page_size() {
3639 return _large_page_size; 3648 return _large_page_size;

mercurial