Mercurial > hg > truffle
comparison src/share/vm/runtime/arguments.cpp @ 12233:40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation.
Reviewed-by: stefank, dholmes
author | tschatzl |
---|---|
date | Wed, 11 Sep 2013 16:25:02 +0200 |
parents | 7944aba7ba41 |
children | 06ae47d9d088 |
comparison
equal
deleted
inserted
replaced
12230:040895ec3920 | 12233:40136aa2cdb1 |
---|---|
26 #include "classfile/javaAssertions.hpp" | 26 #include "classfile/javaAssertions.hpp" |
27 #include "classfile/symbolTable.hpp" | 27 #include "classfile/symbolTable.hpp" |
28 #include "compiler/compilerOracle.hpp" | 28 #include "compiler/compilerOracle.hpp" |
29 #include "memory/allocation.inline.hpp" | 29 #include "memory/allocation.inline.hpp" |
30 #include "memory/cardTableRS.hpp" | 30 #include "memory/cardTableRS.hpp" |
31 #include "memory/genCollectedHeap.hpp" | |
31 #include "memory/referenceProcessor.hpp" | 32 #include "memory/referenceProcessor.hpp" |
32 #include "memory/universe.inline.hpp" | 33 #include "memory/universe.inline.hpp" |
33 #include "oops/oop.inline.hpp" | 34 #include "oops/oop.inline.hpp" |
34 #include "prims/jvmtiExport.hpp" | 35 #include "prims/jvmtiExport.hpp" |
35 #include "runtime/arguments.hpp" | 36 #include "runtime/arguments.hpp" |
52 #ifdef TARGET_OS_FAMILY_bsd | 53 #ifdef TARGET_OS_FAMILY_bsd |
53 # include "os_bsd.inline.hpp" | 54 # include "os_bsd.inline.hpp" |
54 #endif | 55 #endif |
55 #if INCLUDE_ALL_GCS | 56 #if INCLUDE_ALL_GCS |
56 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" | 57 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" |
58 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | |
59 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" | |
57 #endif // INCLUDE_ALL_GCS | 60 #endif // INCLUDE_ALL_GCS |
58 | 61 |
59 // Note: This is a special bug reporting site for the JVM | 62 // Note: This is a special bug reporting site for the JVM |
60 #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" | 63 #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" |
61 #define DEFAULT_JAVA_LAUNCHER "generic" | 64 #define DEFAULT_JAVA_LAUNCHER "generic" |
88 int Arguments::_num_jvm_args = 0; | 91 int Arguments::_num_jvm_args = 0; |
89 char* Arguments::_java_command = NULL; | 92 char* Arguments::_java_command = NULL; |
90 SystemProperty* Arguments::_system_properties = NULL; | 93 SystemProperty* Arguments::_system_properties = NULL; |
91 const char* Arguments::_gc_log_filename = NULL; | 94 const char* Arguments::_gc_log_filename = NULL; |
92 bool Arguments::_has_profile = false; | 95 bool Arguments::_has_profile = false; |
96 size_t Arguments::_conservative_max_heap_alignment = 0; | |
93 uintx Arguments::_min_heap_size = 0; | 97 uintx Arguments::_min_heap_size = 0; |
94 Arguments::Mode Arguments::_mode = _mixed; | 98 Arguments::Mode Arguments::_mode = _mixed; |
95 bool Arguments::_java_compiler = false; | 99 bool Arguments::_java_compiler = false; |
96 bool Arguments::_xdebug_mode = false; | 100 bool Arguments::_xdebug_mode = false; |
97 const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG; | 101 const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG; |
1389 return false; | 1393 return false; |
1390 } | 1394 } |
1391 return true; | 1395 return true; |
1392 } | 1396 } |
1393 | 1397 |
1394 inline uintx max_heap_for_compressed_oops() { | 1398 uintx Arguments::max_heap_for_compressed_oops() { |
1395 // Avoid sign flip. | 1399 // Avoid sign flip. |
1396 assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size"); | 1400 assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size"); |
1397 LP64_ONLY(return OopEncodingHeapMax - os::vm_page_size()); | 1401 // We need to fit both the NULL page and the heap into the memory budget, while |
1402 // keeping alignment constraints of the heap. To guarantee the latter, as the | |
1403 // NULL page is located before the heap, we pad the NULL page to the conservative | |
1404 // maximum alignment that the GC may ever impose upon the heap. | |
1405 size_t displacement_due_to_null_page = align_size_up_(os::vm_page_size(), | |
1406 Arguments::conservative_max_heap_alignment()); | |
1407 | |
1408 LP64_ONLY(return OopEncodingHeapMax - displacement_due_to_null_page); | |
1398 NOT_LP64(ShouldNotReachHere(); return 0); | 1409 NOT_LP64(ShouldNotReachHere(); return 0); |
1399 } | 1410 } |
1400 | 1411 |
1401 bool Arguments::should_auto_select_low_pause_collector() { | 1412 bool Arguments::should_auto_select_low_pause_collector() { |
1402 if (UseAutoGCSelectPolicy && | 1413 if (UseAutoGCSelectPolicy && |
1471 } | 1482 } |
1472 } | 1483 } |
1473 } | 1484 } |
1474 #endif // _LP64 | 1485 #endif // _LP64 |
1475 #endif // !ZERO | 1486 #endif // !ZERO |
1487 } | |
1488 | |
1489 void Arguments::set_conservative_max_heap_alignment() { | |
1490 // The conservative maximum required alignment for the heap is the maximum of | |
1491 // the alignments imposed by several sources: any requirements from the heap | |
1492 // itself, the collector policy and the maximum page size we may run the VM | |
1493 // with. | |
1494 size_t heap_alignment = GenCollectedHeap::conservative_max_heap_alignment(); | |
1495 #if INCLUDE_ALL_GCS | |
1496 if (UseParallelGC) { | |
1497 heap_alignment = ParallelScavengeHeap::conservative_max_heap_alignment(); | |
1498 } else if (UseG1GC) { | |
1499 heap_alignment = G1CollectedHeap::conservative_max_heap_alignment(); | |
1500 } | |
1501 #endif // INCLUDE_ALL_GCS | |
1502 _conservative_max_heap_alignment = MAX3(heap_alignment, os::max_page_size(), | |
1503 CollectorPolicy::compute_max_alignment()); | |
1476 } | 1504 } |
1477 | 1505 |
1478 void Arguments::set_ergonomics_flags() { | 1506 void Arguments::set_ergonomics_flags() { |
1479 | 1507 |
1480 if (os::is_server_class_machine()) { | 1508 if (os::is_server_class_machine()) { |
1500 if (!DumpSharedSpaces && !RequireSharedSpaces && | 1528 if (!DumpSharedSpaces && !RequireSharedSpaces && |
1501 (FLAG_IS_DEFAULT(UseSharedSpaces) || !UseSharedSpaces)) { | 1529 (FLAG_IS_DEFAULT(UseSharedSpaces) || !UseSharedSpaces)) { |
1502 no_shared_spaces(); | 1530 no_shared_spaces(); |
1503 } | 1531 } |
1504 } | 1532 } |
1533 | |
1534 set_conservative_max_heap_alignment(); | |
1505 | 1535 |
1506 #ifndef ZERO | 1536 #ifndef ZERO |
1507 #ifdef _LP64 | 1537 #ifdef _LP64 |
1508 set_use_compressed_oops(); | 1538 set_use_compressed_oops(); |
1509 | 1539 |
3504 FLAG_SET_DEFAULT(PrintSharedSpaces, false); | 3534 FLAG_SET_DEFAULT(PrintSharedSpaces, false); |
3505 } | 3535 } |
3506 no_shared_spaces(); | 3536 no_shared_spaces(); |
3507 #endif // INCLUDE_CDS | 3537 #endif // INCLUDE_CDS |
3508 | 3538 |
3539 return JNI_OK; | |
3540 } | |
3541 | |
3542 jint Arguments::apply_ergo() { | |
3543 | |
3509 // Set flags based on ergonomics. | 3544 // Set flags based on ergonomics. |
3510 set_ergonomics_flags(); | 3545 set_ergonomics_flags(); |
3511 | 3546 |
3512 set_shared_spaces_flags(); | 3547 set_shared_spaces_flags(); |
3513 | 3548 |