The following code:
char* os::attempt_reserve_memory_at(size_t bytes, char* addr, int file_desc) {
char* result = NULL;
if (file_desc != -1) {
result = pd_attempt_reserve_memory_at(bytes, addr, file_desc);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
} else {
result = pd_attempt_reserve_memory_at(bytes, addr);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
}
return result;
}
shouldn't be calling record_virtual_memory_reserve_and_commit in the last conditional. It should be using record_virtual_memory_reserve.
Just like os::reserve_memory does:
char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int file_desc) {
char* result = NULL;
if (file_desc != -1) {
// Could have called pd_reserve_memory() followed by replace_existing_mapping_with_file_mapping(),
// but AIX may use SHM in which case its more trouble to detach the segment and remap memory to the file.
result = os::map_memory_to_file(addr, bytes, file_desc);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
} else {
result = pd_reserve_memory(bytes, addr, alignment_hint);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
}
}
return result;
}
char* os::attempt_reserve_memory_at(size_t bytes, char* addr, int file_desc) {
char* result = NULL;
if (file_desc != -1) {
result = pd_attempt_reserve_memory_at(bytes, addr, file_desc);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
} else {
result = pd_attempt_reserve_memory_at(bytes, addr);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
}
return result;
}
shouldn't be calling record_virtual_memory_reserve_and_commit in the last conditional. It should be using record_virtual_memory_reserve.
Just like os::reserve_memory does:
char* os::reserve_memory(size_t bytes, char* addr, size_t alignment_hint, int file_desc) {
char* result = NULL;
if (file_desc != -1) {
// Could have called pd_reserve_memory() followed by replace_existing_mapping_with_file_mapping(),
// but AIX may use SHM in which case its more trouble to detach the segment and remap memory to the file.
result = os::map_memory_to_file(addr, bytes, file_desc);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve_and_commit((address)result, bytes, CALLER_PC);
}
} else {
result = pd_reserve_memory(bytes, addr, alignment_hint);
if (result != NULL) {
MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC);
}
}
return result;
}
- relates to
-
JDK-8196405 [REDO] NMT: add_committed_regions doesn't merge succeeding regions
-
- Resolved
-