RFR: 8067785: Using AlwaysPreTouch does not always touch all pages
Stefan Karlsson
stefan.karlsson at oracle.com
Fri Apr 15 14:13:40 UTC 2016
Hi all,
Please review this patch that ensures that VirtualSpace::expand_by
pre-touches all committed memory.
http://cr.openjdk.java.net/~stefank/8067785/webrev.01
https://bugs.openjdk.java.net/browse/JDK-8067785
1) Previously, we pre-touched the memory between the old and new _high
pointers. Since the _high variable isn't page aligned, the pre-touch
code didn't touch all committed pages. I've moved the pre-touch code to
be done for every os::commit_memory call in VirtuaSpace::expand_by.
2) expand_by has segregated the VirtualSpace into three segements.
[small pages | large pages | small pages] so that we can have
VirtualSpaces that are not large page size aligned. Previously, only the
middle section called commit_memory with an alignment hint, and the
small pages sections called commit_memory without a small pages hint. On
all platforms, except Solaris, this boils down to the same code. On
Solaris we have this additional code executed:
size_t page_size = page_size_for_alignment(alignment_hint);
if (page_size > (size_t) vm_page_size()) {
(void)Solaris::setup_large_pages(addr, bytes, page_size);
}
But since the alignment_hint is set to vm_page_size we won't try to
setup_large_pages here either.
3) The patch also contains a few style changes to make the
VirtualSpace::expand_by easier to read (at least for me)
Tested with JPRT and -XX:+ExecuteInternalVMTests with AlwaysPreTouch
temporarily forced to true.
Thanks,
StefanK
More information about the hotspot-dev
mailing list