提交 64586b6d 编写于 作者: S sla

Merge

...@@ -66,10 +66,9 @@ void GenerationSizer::initialize_flags() { ...@@ -66,10 +66,9 @@ void GenerationSizer::initialize_flags() {
void GenerationSizer::initialize_size_info() { void GenerationSizer::initialize_size_info() {
trace_gen_sizes("ps heap raw"); trace_gen_sizes("ps heap raw");
const size_t max_page_sz = os::page_size_for_region(_max_heap_byte_size, 8); const size_t page_sz = os::page_size_for_region(_min_heap_byte_size,
const size_t min_pages = 4; // 1 for eden + 1 for each survivor + 1 for old _max_heap_byte_size,
const size_t min_page_sz = os::page_size_for_region(_min_heap_byte_size, min_pages); 8);
const size_t page_sz = MIN2(max_page_sz, min_page_sz);
// Can a page size be something else than a power of two? // Can a page size be something else than a power of two?
assert(is_power_of_2((intptr_t)page_sz), "must be a power of 2"); assert(is_power_of_2((intptr_t)page_sz), "must be a power of 2");
......
...@@ -56,7 +56,7 @@ ParMarkBitMap::initialize(MemRegion covered_region) ...@@ -56,7 +56,7 @@ ParMarkBitMap::initialize(MemRegion covered_region)
const size_t words = bits / BitsPerWord; const size_t words = bits / BitsPerWord;
const size_t raw_bytes = words * sizeof(idx_t); const size_t raw_bytes = words * sizeof(idx_t);
const size_t page_sz = os::page_size_for_region(raw_bytes, 10); const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity(); const size_t granularity = os::vm_allocation_granularity();
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity)); _reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
......
...@@ -403,7 +403,7 @@ PSVirtualSpace* ...@@ -403,7 +403,7 @@ PSVirtualSpace*
ParallelCompactData::create_vspace(size_t count, size_t element_size) ParallelCompactData::create_vspace(size_t count, size_t element_size)
{ {
const size_t raw_bytes = count * element_size; const size_t raw_bytes = count * element_size;
const size_t page_sz = os::page_size_for_region(raw_bytes, 10); const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity(); const size_t granularity = os::vm_allocation_granularity();
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity)); _reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
......
...@@ -98,13 +98,9 @@ bool CodeHeap::reserve(size_t reserved_size, size_t committed_size, ...@@ -98,13 +98,9 @@ bool CodeHeap::reserve(size_t reserved_size, size_t committed_size,
_log2_segment_size = exact_log2(segment_size); _log2_segment_size = exact_log2(segment_size);
// Reserve and initialize space for _memory. // Reserve and initialize space for _memory.
size_t page_size = os::vm_page_size(); const size_t page_size = os::can_execute_large_page_memory() ?
if (os::can_execute_large_page_memory()) { os::page_size_for_region(committed_size, reserved_size, 8) :
const size_t min_pages = 8; os::vm_page_size();
page_size = MIN2(os::page_size_for_region(committed_size, min_pages),
os::page_size_for_region(reserved_size, min_pages));
}
const size_t granularity = os::vm_allocation_granularity(); const size_t granularity = os::vm_allocation_granularity();
const size_t r_align = MAX2(page_size, granularity); const size_t r_align = MAX2(page_size, granularity);
const size_t r_size = align_size_up(reserved_size, r_align); const size_t r_size = align_size_up(reserved_size, r_align);
......
...@@ -3865,7 +3865,6 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) { ...@@ -3865,7 +3865,6 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
unit_test_function_call unit_test_function_call
// Forward declaration // Forward declaration
void TestOS_test();
void TestReservedSpace_test(); void TestReservedSpace_test();
void TestReserveMemorySpecial_test(); void TestReserveMemorySpecial_test();
void TestVirtualSpace_test(); void TestVirtualSpace_test();
...@@ -3887,7 +3886,6 @@ void TestCodeCacheRemSet_test(); ...@@ -3887,7 +3886,6 @@ void TestCodeCacheRemSet_test();
void execute_internal_vm_tests() { void execute_internal_vm_tests() {
if (ExecuteInternalVMTests) { if (ExecuteInternalVMTests) {
tty->print_cr("Running internal VM tests"); tty->print_cr("Running internal VM tests");
run_unit_test(TestOS_test());
run_unit_test(TestReservedSpace_test()); run_unit_test(TestReservedSpace_test());
run_unit_test(TestReserveMemorySpecial_test()); run_unit_test(TestReserveMemorySpecial_test());
run_unit_test(TestVirtualSpace_test()); run_unit_test(TestVirtualSpace_test());
......
...@@ -1303,15 +1303,24 @@ bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) { ...@@ -1303,15 +1303,24 @@ bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
return (sp > (stack_limit + reserved_area)); return (sp > (stack_limit + reserved_area));
} }
size_t os::page_size_for_region(size_t region_size, size_t min_pages) { size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size,
uint min_pages)
{
assert(min_pages > 0, "sanity"); assert(min_pages > 0, "sanity");
if (UseLargePages) { if (UseLargePages) {
const size_t max_page_size = region_size / min_pages; const size_t max_page_size = region_max_size / min_pages;
for (unsigned int i = 0; _page_sizes[i] != 0; ++i) {
const size_t sz = _page_sizes[i];
const size_t mask = sz - 1;
if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) {
// The largest page size with no fragmentation.
return sz;
}
for (size_t i = 0; _page_sizes[i] != 0; ++i) { if (sz <= max_page_size) {
const size_t page_size = _page_sizes[i]; // The largest page size that satisfies the min_pages requirement.
if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) { return sz;
return page_size;
} }
} }
} }
...@@ -1539,63 +1548,3 @@ os::SuspendResume::State os::SuspendResume::switch_state(os::SuspendResume::Stat ...@@ -1539,63 +1548,3 @@ os::SuspendResume::State os::SuspendResume::switch_state(os::SuspendResume::Stat
return result; return result;
} }
#endif #endif
/////////////// Unit tests ///////////////
#ifndef PRODUCT
#define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b))
class TestOS : AllStatic {
static size_t small_page_size() {
return os::vm_page_size();
}
static size_t large_page_size() {
const size_t large_page_size_example = 4 * M;
return os::page_size_for_region(large_page_size_example, 1);
}
static void test_page_size_for_region() {
if (UseLargePages) {
const size_t small_page = small_page_size();
const size_t large_page = large_page_size();
if (large_page > small_page) {
size_t num_small_pages_in_large = large_page / small_page;
size_t page = os::page_size_for_region(large_page, num_small_pages_in_large);
assert_eq(page, small_page);
}
}
}
static void test_page_size_for_region_alignment() {
if (UseLargePages) {
const size_t small_page = small_page_size();
const size_t large_page = large_page_size();
if (large_page > small_page) {
const size_t unaligned_region = large_page + 17;
size_t page = os::page_size_for_region(unaligned_region, 1);
assert_eq(page, small_page);
const size_t num_pages = 5;
const size_t aligned_region = large_page * num_pages;
page = os::page_size_for_region(aligned_region, num_pages);
assert_eq(page, large_page);
}
}
}
public:
static void run_tests() {
test_page_size_for_region();
test_page_size_for_region_alignment();
}
};
void TestOS_test() {
TestOS::run_tests();
}
#endif // PRODUCT
...@@ -253,11 +253,19 @@ class os: AllStatic { ...@@ -253,11 +253,19 @@ class os: AllStatic {
// Return the default page size. // Return the default page size.
static int vm_page_size(); static int vm_page_size();
// Returns the page size to use for a region of memory. // Return the page size to use for a region of memory. The min_pages argument
// region_size / min_pages will always be greater than or equal to the // is a hint intended to limit fragmentation; it says the returned page size
// returned value. // should be <= region_max_size / min_pages. Because min_pages is a hint,
static size_t page_size_for_region(size_t region_size, size_t min_pages); // this routine may return a size larger than region_max_size / min_pages.
//
// The current implementation ignores min_pages if a larger page size is an
// exact multiple of both region_min_size and region_max_size. This allows
// larger pages to be used when doing so would not cause fragmentation; in
// particular, a single page can be used when region_min_size ==
// region_max_size == a supported page size.
static size_t page_size_for_region(size_t region_min_size,
size_t region_max_size,
uint min_pages);
// Return the largest page size that can be used // Return the largest page size that can be used
static size_t max_page_size() { static size_t max_page_size() {
// The _page_sizes array is sorted in descending order. // The _page_sizes array is sorted in descending order.
......
...@@ -53,7 +53,7 @@ ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), ...@@ -53,7 +53,7 @@ ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0),
} }
ReservedSpace::ReservedSpace(size_t size) { ReservedSpace::ReservedSpace(size_t size) {
size_t page_size = os::page_size_for_region(size, 1); size_t page_size = os::page_size_for_region(size, size, 1);
bool large_pages = page_size != (size_t)os::vm_page_size(); bool large_pages = page_size != (size_t)os::vm_page_size();
// Don't force the alignment to be large page aligned, // Don't force the alignment to be large page aligned,
// since that will waste memory. // since that will waste memory.
...@@ -372,7 +372,7 @@ VirtualSpace::VirtualSpace() { ...@@ -372,7 +372,7 @@ VirtualSpace::VirtualSpace() {
bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) { bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) {
const size_t max_commit_granularity = os::page_size_for_region(rs.size(), 1); const size_t max_commit_granularity = os::page_size_for_region(rs.size(), rs.size(), 1);
return initialize_with_granularity(rs, committed_size, max_commit_granularity); return initialize_with_granularity(rs, committed_size, max_commit_granularity);
} }
...@@ -1007,7 +1007,7 @@ class TestVirtualSpace : AllStatic { ...@@ -1007,7 +1007,7 @@ class TestVirtualSpace : AllStatic {
case Disable: case Disable:
return vs.initialize_with_granularity(rs, 0, os::vm_page_size()); return vs.initialize_with_granularity(rs, 0, os::vm_page_size());
case Commit: case Commit:
return vs.initialize_with_granularity(rs, 0, os::page_size_for_region(rs.size(), 1)); return vs.initialize_with_granularity(rs, 0, os::page_size_for_region(rs.size(), rs.size(), 1));
} }
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
/* /*
* @ignore 8027915
* @test TestParallelHeapSizeFlags * @test TestParallelHeapSizeFlags
* @key gc * @key gc
* @bug 8006088 * @bug 8006088
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册