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