--- old/src/share/vm/runtime/arguments.cpp 2013-08-28 14:34:31.276178725 +0200 +++ new/src/share/vm/runtime/arguments.cpp 2013-08-28 14:34:31.204178727 +0200 @@ -52,7 +52,10 @@ #ifdef TARGET_OS_FAMILY_bsd # include "os_bsd.inline.hpp" #endif +#include "memory/genCollectedHeap.hpp" #if INCLUDE_ALL_GCS +#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" +#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" #endif // INCLUDE_ALL_GCS @@ -90,6 +93,7 @@ SystemProperty* Arguments::_system_properties = NULL; const char* Arguments::_gc_log_filename = NULL; bool Arguments::_has_profile = false; +size_t Arguments::_largest_heap_alignment = 0; uintx Arguments::_min_heap_size = 0; Arguments::Mode Arguments::_mode = _mixed; bool Arguments::_java_compiler = false; @@ -1391,10 +1395,12 @@ return true; } -inline uintx max_heap_for_compressed_oops() { +uintx Arguments::max_heap_for_compressed_oops() { // Avoid sign flip. assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size"); - LP64_ONLY(return OopEncodingHeapMax - os::vm_page_size()); + size_t aligned_null_page_size = align_size_up_(os::vm_page_size(), Arguments::largest_heap_alignment()); + + LP64_ONLY(return OopEncodingHeapMax - aligned_null_page_size); NOT_LP64(ShouldNotReachHere(); return 0); } @@ -1475,6 +1481,23 @@ #endif // !ZERO } +void Arguments::set_largest_max_heap_alignment() { + size_t gc_alignment; +#if INCLUDE_ALL_GCS + if (UseParallelGC) { + gc_alignment = ParallelScavengeHeap::max_heap_alignment(); + } else if (UseG1GC) { + gc_alignment = G1CollectedHeap::max_heap_alignment(); + } else { +#endif // INCLUDE_ALL_GCS + gc_alignment = GenCollectedHeap::max_heap_alignment(); +#if INCLUDE_ALL_GCS + } +#endif // INCLUDE_ALL_GCS + _largest_heap_alignment = MAX3(gc_alignment, os::max_page_size(), + CollectorPolicy::compute_largest_heap_alignment()); +} + void Arguments::set_ergonomics_flags() { if (os::is_server_class_machine()) { @@ -1503,6 +1526,8 @@ } } + set_largest_max_heap_alignment(); + #ifndef ZERO #ifdef _LP64 set_use_compressed_oops(); @@ -3517,6 +3542,11 @@ no_shared_spaces(); #endif // INCLUDE_CDS + // We need to initialize large page support here because ergonomics takes some + // decisions depending on large page support and the calculated large page size. + // Ergonomics may turn off large page support off later again. + os::large_page_init(); + // Set flags based on ergonomics. set_ergonomics_flags();