--- old/src/share/vm/memory/allocation.inline.hpp 2013-04-25 13:37:25.190693000 -0400 +++ new/src/share/vm/memory/allocation.inline.hpp 2013-04-25 13:37:24.171241000 -0400 @@ -128,7 +128,7 @@ int alignment = os::vm_allocation_granularity(); _size = align_size_up(_size, alignment); - _addr = os::reserve_memory(_size, NULL, alignment); + _addr = os::reserve_memory(_size, NULL, alignment, F); if (_addr == NULL) { vm_exit_out_of_memory(_size, "Allocator (reserve)"); } --- old/src/share/vm/runtime/os.cpp 2013-04-25 13:37:28.909687000 -0400 +++ new/src/share/vm/runtime/os.cpp 2013-04-25 13:37:27.769667000 -0400 @@ -1457,6 +1457,18 @@ return result; } + +char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, + MEMFLAGS flags) { + char* result = pd_reserve_memory(bytes, addr, alignment_hint); + if (result != NULL) { + MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + MemTracker::record_virtual_memory_type((address)result, flags); + } + + return result; +} + char* os::attempt_reserve_memory_at(size_t bytes, char* addr) { char* result = pd_attempt_reserve_memory_at(bytes, addr); if (result != NULL) { --- old/src/share/vm/runtime/os.hpp 2013-04-25 13:37:32.510133000 -0400 +++ new/src/share/vm/runtime/os.hpp 2013-04-25 13:37:31.448756000 -0400 @@ -255,6 +255,8 @@ static int vm_allocation_granularity(); static char* reserve_memory(size_t bytes, char* addr = 0, size_t alignment_hint = 0); + static char* reserve_memory(size_t bytes, char* addr, + size_t alignment_hint, MEMFLAGS flags); static char* reserve_memory_aligned(size_t size, size_t alignment); static char* attempt_reserve_memory_at(size_t bytes, char* addr); static void split_reserved_memory(char *base, size_t size, --- old/src/share/vm/services/memSnapshot.cpp 2013-04-25 13:37:36.066706000 -0400 +++ new/src/share/vm/services/memSnapshot.cpp 2013-04-25 13:37:35.028284000 -0400 @@ -262,13 +262,21 @@ assert(cur->is_reserved_region() && cur->contains_region(rec), "Sanity check"); if (rec->is_same_region(cur)) { - // release whole reserved region + // release whole reserved region and all committed regions within the reserved region #ifdef ASSERT - VMMemRegion* next_region = (VMMemRegion*)peek_next(); - // should not have any committed memory in this reserved region - assert(next_region == NULL || !next_region->is_committed_region(), "Sanity check"); + address low_addr = cur->addr(); + address high_addr = low_addr + cur->size(); #endif remove(); + // remove committed regions within the reserved region + VMMemRegion* next_region = (VMMemRegion*)current(); + while (next_region != NULL && next_region->is_committed_region()) { + assert(next_region->addr() >= low_addr && + next_region->addr() + next_region->size() <= high_addr, + "Range check"); + remove(); + next_region = (VMMemRegion*)current(); + } } else if (rec->addr() == cur->addr() || rec->addr() + rec->size() == cur->addr() + cur->size()) { // released region is at either end of this region