--- old/src/share/vm/runtime/os.cpp 2013-05-13 16:34:50.850905000 -0400 +++ new/src/share/vm/runtime/os.cpp 2013-05-13 16:34:49.806982000 -0400 @@ -637,9 +637,9 @@ debug_only(if (paranoid) verify_block(memblock)); if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock); - // we do not track MallocCushion memory - MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller); - + // we don't track MallocCushion memory + NMTTrackOp op(NMTTrackOp::MallocOp); + op.execute_op((address)memblock, size, memflags, caller == NULL ? CALLER_PC : caller); return memblock; } @@ -648,10 +648,14 @@ #ifndef ASSERT NOT_PRODUCT(inc_stat_counter(&num_mallocs, 1)); NOT_PRODUCT(inc_stat_counter(&alloc_bytes, size)); + + NMTTrackOp op(NMTTrackOp::ReallocOp); void* ptr = ::realloc(memblock, size); if (ptr != NULL) { - MemTracker::record_realloc((address)memblock, (address)ptr, size, memflags, - caller == 0 ? CALLER_PC : caller); + op.execute_op((address)memblock, (address)ptr, size, memflags, + caller == NULL ? CALLER_PC : caller); + } else { + op.abort_op(); } return ptr; #else @@ -716,8 +720,9 @@ fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock); } #endif - MemTracker::record_free((address)memblock, memflags); - + NMTTrackOp op(NMTTrackOp::FreeOp); + // the op has to be executed before actually free to avoid race + op.execute_op((address)memblock); ::free((char*)memblock - space_before); } @@ -1452,7 +1457,8 @@ char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint) { char* result = pd_reserve_memory(bytes, addr, alignment_hint); if (result != NULL) { - MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + NMTTrackOp op(NMTTrackOp::ReserveOp); + op.execute_op((address)result, bytes, 0, CALLER_PC); } return result; @@ -1462,8 +1468,8 @@ 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); + NMTTrackOp op(NMTTrackOp::ReserveOp); + op.execute_op((address)result, bytes, flags, CALLER_PC); } return result; @@ -1472,7 +1478,8 @@ char* os::attempt_reserve_memory_at(size_t bytes, char* addr) { char* result = pd_attempt_reserve_memory_at(bytes, addr); if (result != NULL) { - MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); + NMTTrackOp op(NMTTrackOp::ReserveOp); + op.execute_op((address)result, bytes, 0, CALLER_PC); } return result; } @@ -1485,7 +1492,8 @@ bool os::commit_memory(char* addr, size_t bytes, bool executable) { bool res = pd_commit_memory(addr, bytes, executable); if (res) { - MemTracker::record_virtual_memory_commit((address)addr, bytes, CALLER_PC); + NMTTrackOp op(NMTTrackOp::CommitOp); + op.execute_op((address)addr, bytes, 0, CALLER_PC); } return res; } @@ -1494,23 +1502,32 @@ bool executable) { bool res = os::pd_commit_memory(addr, size, alignment_hint, executable); if (res) { - MemTracker::record_virtual_memory_commit((address)addr, size, CALLER_PC); + NMTTrackOp op(NMTTrackOp::CommitOp); + op.execute_op((address)addr, size, 0, CALLER_PC); } return res; } bool os::uncommit_memory(char* addr, size_t bytes) { + // The op has to be instantiated before actually uncommit + NMTTrackOp op(NMTTrackOp::UncommitOp); bool res = pd_uncommit_memory(addr, bytes); if (res) { - MemTracker::record_virtual_memory_uncommit((address)addr, bytes); + op.execute_op((address)addr, bytes); + } else { + op.abort_op(); } return res; } bool os::release_memory(char* addr, size_t bytes) { + // The op has to be instantiated before actully release + NMTTrackOp op(NMTTrackOp::ReleaseOp); bool res = pd_release_memory(addr, bytes); if (res) { - MemTracker::record_virtual_memory_release((address)addr, bytes); + op.execute_op((address)addr, bytes); + } else { + op.abort_op(); } return res; } @@ -1521,8 +1538,8 @@ bool allow_exec) { char* result = pd_map_memory(fd, file_name, file_offset, addr, bytes, read_only, allow_exec); if (result != NULL) { - MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC); - MemTracker::record_virtual_memory_commit((address)result, bytes, CALLER_PC); + NMTTrackOp op(NMTTrackOp::ReserveAndCommitOp); + op.execute_op((address)result, bytes, 0, CALLER_PC); } return result; } @@ -1535,10 +1552,12 @@ } bool os::unmap_memory(char *addr, size_t bytes) { + NMTTrackOp op(NMTTrackOp::ReleaseOp); bool result = pd_unmap_memory(addr, bytes); if (result) { - MemTracker::record_virtual_memory_uncommit((address)addr, bytes); - MemTracker::record_virtual_memory_release((address)addr, bytes); + op.execute_op((address)addr, bytes); + } else { + op.abort_op(); } return result; }