--- old/src/share/vm/memory/allocation.inline.hpp 2017-06-20 16:28:23.410204539 -0400 +++ new/src/share/vm/memory/allocation.inline.hpp 2017-06-20 16:28:22.718201107 -0400 @@ -268,4 +268,29 @@ } } +template void* CMmapObj::operator new(size_t size) { + int alignment = os::vm_allocation_granularity(); + + int pages = (int)(size / os::vm_page_size()); + if (pages == 0 || size % (pages * os::vm_page_size()) != 0) pages++; + size_t mmap_size = pages * os::vm_page_size(); + + char* addr = os::reserve_memory(mmap_size, NULL, alignment, F); + if (addr == NULL) { + vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "VTBuffer (reserve)"); + } + + os::commit_memory_or_exit(addr, mmap_size, !ExecMem, "VTBuffer (commit)"); + + return addr; +} + +template void CMmapObj::operator delete(void* addr, size_t length) { + int pages = (int)(length / os::vm_page_size()); + if (pages == 0 || length % (pages * os::vm_page_size()) != 0) pages++; + size_t mmap_size = pages * os::vm_page_size(); + bool result = os::release_memory((char*)addr, mmap_size); + assert(result, "Failed to release memory"); +} + #endif // SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP