< prev index next >
src/hotspot/share/memory/virtualspace.cpp
Print this page
rev 52439 : [mq]: webrev.2_reserved_page_size
@@ -34,14 +34,14 @@
// ReservedSpace
// Dummy constructor
ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0),
- _alignment(0), _special(false), _fd_for_heap(-1), _executable(false) {
+ _alignment(0), _special(false), _fd_for_heap(-1), _actual_page_size(0), _executable(false) {
}
-ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1) {
+ReservedSpace::ReservedSpace(size_t size, size_t preferred_page_size) : _fd_for_heap(-1), _actual_page_size(0) {
bool has_preferred_page_size = preferred_page_size != 0;
// Want to use large pages where possible and pad with small pages.
size_t page_size = has_preferred_page_size ? preferred_page_size : os::page_size_for_region_unaligned(size, 1);
bool large_pages = page_size != (size_t)os::vm_page_size();
size_t alignment;
@@ -58,22 +58,22 @@
initialize(size, alignment, large_pages, NULL, false);
}
ReservedSpace::ReservedSpace(size_t size, size_t alignment,
bool large,
- char* requested_address) : _fd_for_heap(-1) {
+ char* requested_address) : _fd_for_heap(-1), _actual_page_size(0) {
initialize(size, alignment, large, requested_address, false);
}
ReservedSpace::ReservedSpace(size_t size, size_t alignment,
bool large,
- bool executable) : _fd_for_heap(-1) {
+ bool executable) : _fd_for_heap(-1), _actual_page_size(0) {
initialize(size, alignment, large, NULL, executable);
}
ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment,
- bool special, bool executable) : _fd_for_heap(-1) {
+ bool special, bool executable) : _fd_for_heap(-1), _actual_page_size(0) {
assert((size % os::vm_allocation_granularity()) == 0,
"size not allocation aligned");
_base = base;
_size = size;
_alignment = alignment;
@@ -115,10 +115,23 @@
}
}
return true;
}
+// Should be called after _special is decided.
+void ReservedSpace::update_actual_page_size(bool large_page) {
+ // There are two ways to manage large page memory in ReservedSpace.
+ // 1. OS supports committing large page memory.
+ // 2. OS doesn't support committing large page memory so ReservedSpace manages it specially.
+ // When succeeded reserving it, '_special' will be set.
+ if (large_page && (os::can_commit_large_page_memory() || _special)) {
+ _actual_page_size = os::large_page_size();
+ } else {
+ _actual_page_size = os::vm_page_size();
+ }
+}
+
void ReservedSpace::initialize(size_t size, size_t alignment, bool large,
char* requested_address,
bool executable) {
const size_t granularity = os::vm_allocation_granularity();
assert((size & (granularity - 1)) == 0,
@@ -226,10 +239,12 @@
_alignment = alignment;
// If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true
if (_fd_for_heap != -1) {
_special = true;
}
+
+ update_actual_page_size(large);
}
ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment,
bool split, bool realloc) {
assert(partition_size <= size(), "partition failed");
@@ -288,10 +303,11 @@
_size = 0;
_noaccess_prefix = 0;
_alignment = 0;
_special = false;
_executable = false;
+ _actual_page_size = 0;
}
}
static size_t noaccess_prefix_size(size_t alignment) {
return lcm(os::vm_page_size(), alignment);
@@ -397,15 +413,15 @@
// Done
_base = base;
_size = size;
_alignment = alignment;
-
// If heap is reserved with a backing file, the entire space has been committed. So set the _special flag to true
if (_fd_for_heap != -1) {
_special = true;
}
+ update_actual_page_size(large);
// Check alignment constraints
if ((((size_t)base) & (alignment - 1)) != 0) {
// Base not aligned, retry.
release();
< prev index next >