aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoriveresov <none@none>2011-12-27 16:43:49 -0800
committeriveresov <none@none>2011-12-27 16:43:49 -0800
commit87dac77941f3c1011b8b892d0446223bd060ad9a (patch)
treecd77c60f66e8f4c70917a53d807e4e3ddcbc1e0a /src
parent1c9fcb868bdbc5e37d02cd161f5a60cd11e12e7f (diff)
7124829: NUMA: memory leak on Linux with large pages
Summary: In os::free_memory() use mmap with the same attributes as for the heap space Reviewed-by: kvn Contributed-by: Aleksey Ignatenko <aleksey.v.ignatenko@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/os/bsd/vm/os_bsd.cpp2
-rw-r--r--src/os/linux/vm/os_linux.cpp4
-rw-r--r--src/os/solaris/vm/os_solaris.cpp2
-rw-r--r--src/os/windows/vm/os_windows.cpp2
-rw-r--r--src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp6
-rw-r--r--src/share/vm/gc_implementation/shared/mutableSpace.cpp2
-rw-r--r--src/share/vm/runtime/os.hpp2
7 files changed, 10 insertions, 10 deletions
diff --git a/src/os/bsd/vm/os_bsd.cpp b/src/os/bsd/vm/os_bsd.cpp
index c4af904a3..c6e27b273 100644
--- a/src/os/bsd/vm/os_bsd.cpp
+++ b/src/os/bsd/vm/os_bsd.cpp
@@ -2835,7 +2835,7 @@ void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
#endif
}
-void os::free_memory(char *addr, size_t bytes) {
+void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
::madvise(addr, bytes, MADV_DONTNEED);
}
diff --git a/src/os/linux/vm/os_linux.cpp b/src/os/linux/vm/os_linux.cpp
index a141f6a66..0946b753e 100644
--- a/src/os/linux/vm/os_linux.cpp
+++ b/src/os/linux/vm/os_linux.cpp
@@ -2546,8 +2546,8 @@ void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) {
}
}
-void os::free_memory(char *addr, size_t bytes) {
- commit_memory(addr, bytes, false);
+void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) {
+ commit_memory(addr, bytes, alignment_hint, false);
}
void os::numa_make_global(char *addr, size_t bytes) {
diff --git a/src/os/solaris/vm/os_solaris.cpp b/src/os/solaris/vm/os_solaris.cpp
index f4043e195..925152c3b 100644
--- a/src/os/solaris/vm/os_solaris.cpp
+++ b/src/os/solaris/vm/os_solaris.cpp
@@ -2821,7 +2821,7 @@ bool os::commit_memory(char* addr, size_t bytes, size_t alignment_hint,
}
// Uncommit the pages in a specified region.
-void os::free_memory(char* addr, size_t bytes) {
+void os::free_memory(char* addr, size_t bytes, size_t alignment_hint) {
if (madvise(addr, bytes, MADV_FREE) < 0) {
debug_only(warning("MADV_FREE failed."));
return;
diff --git a/src/os/windows/vm/os_windows.cpp b/src/os/windows/vm/os_windows.cpp
index 01ccc179e..ab608ca85 100644
--- a/src/os/windows/vm/os_windows.cpp
+++ b/src/os/windows/vm/os_windows.cpp
@@ -3130,7 +3130,7 @@ bool os::unguard_memory(char* addr, size_t bytes) {
}
void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
-void os::free_memory(char *addr, size_t bytes) { }
+void os::free_memory(char *addr, size_t bytes, size_t alignment_hint) { }
void os::numa_make_global(char *addr, size_t bytes) { }
void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { }
bool os::numa_topology_changed() { return false; }
diff --git a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
index e38556db7..dd8a76d92 100644
--- a/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
+++ b/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
@@ -282,7 +282,7 @@ void MutableNUMASpace::bias_region(MemRegion mr, int lgrp_id) {
// large page can be broken down if we require small pages.
os::realign_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
// Then we uncommit the pages in the range.
- os::free_memory((char*)aligned_region.start(), aligned_region.byte_size());
+ os::free_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
// And make them local/first-touch biased.
os::numa_make_local((char*)aligned_region.start(), aligned_region.byte_size(), lgrp_id);
}
@@ -297,7 +297,7 @@ void MutableNUMASpace::free_region(MemRegion mr) {
assert((intptr_t)aligned_region.start() % page_size() == 0 &&
(intptr_t)aligned_region.byte_size() % page_size() == 0, "Bad alignment");
assert(region().contains(aligned_region), "Sanity");
- os::free_memory((char*)aligned_region.start(), aligned_region.byte_size());
+ os::free_memory((char*)aligned_region.start(), aligned_region.byte_size(), page_size());
}
}
@@ -954,7 +954,7 @@ void MutableNUMASpace::LGRPSpace::scan_pages(size_t page_size, size_t page_count
if (e != scan_end) {
if ((page_expected.size != page_size || page_expected.lgrp_id != lgrp_id())
&& page_expected.size != 0) {
- os::free_memory(s, pointer_delta(e, s, sizeof(char)));
+ os::free_memory(s, pointer_delta(e, s, sizeof(char)), page_size);
}
page_expected = page_found;
}
diff --git a/src/share/vm/gc_implementation/shared/mutableSpace.cpp b/src/share/vm/gc_implementation/shared/mutableSpace.cpp
index 41f636582..9725c4a1e 100644
--- a/src/share/vm/gc_implementation/shared/mutableSpace.cpp
+++ b/src/share/vm/gc_implementation/shared/mutableSpace.cpp
@@ -51,7 +51,7 @@ void MutableSpace::numa_setup_pages(MemRegion mr, bool clear_space) {
size_t size = pointer_delta(end, start, sizeof(char));
if (clear_space) {
// Prefer page reallocation to migration.
- os::free_memory((char*)start, size);
+ os::free_memory((char*)start, size, page_size);
}
os::numa_make_global((char*)start, size);
}
diff --git a/src/share/vm/runtime/os.hpp b/src/share/vm/runtime/os.hpp
index 0ea0ae93f..0eedf851c 100644
--- a/src/share/vm/runtime/os.hpp
+++ b/src/share/vm/runtime/os.hpp
@@ -256,7 +256,7 @@ class os: AllStatic {
char *addr, size_t bytes, bool read_only,
bool allow_exec);
static bool unmap_memory(char *addr, size_t bytes);
- static void free_memory(char *addr, size_t bytes);
+ static void free_memory(char *addr, size_t bytes, size_t alignment_hint);
static void realign_memory(char *addr, size_t bytes, size_t alignment_hint);
// NUMA-specific interface