--- a/hotspot/src/os/linux/vm/os_linux.cpp Tue Aug 05 14:18:44 2014 +0000
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Aug 07 12:18:58 2014 -0700
@@ -3504,9 +3504,12 @@
assert(is_ptr_aligned(start, alignment), "Must be");
- // os::reserve_memory_special will record this memory area.
- // Need to release it here to prevent overlapping reservations.
- MemTracker::record_virtual_memory_release((address)start, bytes);
+ if (MemTracker::tracking_level() > NMT_minimal) {
+ // os::reserve_memory_special will record this memory area.
+ // Need to release it here to prevent overlapping reservations.
+ Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
+ tkr.record((address)start, bytes);
+ }
char* end = start + bytes;
@@ -3601,7 +3604,7 @@
}
// The memory is committed
- MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, mtNone, CALLER_PC);
+ MemTracker::record_virtual_memory_reserve_and_commit((address)addr, bytes, CALLER_PC);
}
return addr;
@@ -3617,24 +3620,30 @@
}
bool os::release_memory_special(char* base, size_t bytes) {
+ bool res;
+ if (MemTracker::tracking_level() > NMT_minimal) {
+ Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
+ res = os::Linux::release_memory_special_impl(base, bytes);
+ if (res) {
+ tkr.record((address)base, bytes);
+ }
+
+ } else {
+ res = os::Linux::release_memory_special_impl(base, bytes);
+ }
+ return res;
+}
+
+bool os::Linux::release_memory_special_impl(char* base, size_t bytes) {
assert(UseLargePages, "only for large pages");
-
- MemTracker::Tracker tkr = MemTracker::get_virtual_memory_release_tracker();
-
bool res;
+
if (UseSHM) {
res = os::Linux::release_memory_special_shm(base, bytes);
} else {
assert(UseHugeTLBFS, "must be");
res = os::Linux::release_memory_special_huge_tlbfs(base, bytes);
}
-
- if (res) {
- tkr.record((address)base, bytes);
- } else {
- tkr.discard();
- }
-
return res;
}