# HG changeset patch # User iveresov # Date 1288738966 25200 # Node ID 9de67bf4244db331524ab7d95ad261c566ae21ba # Parent f5c8d6e5bfee2364d0581cfd97c25058e3848fdc 6996136: VM crash in src/share/vm/runtime/virtualspace.cpp:424 Summary: Turn CDS off if compressed oops is on Reviewed-by: ysr, kvn, jcoomes, phh diff -r f5c8d6e5bfee -r 9de67bf4244d src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Mon Nov 01 10:49:14 2010 -0700 +++ b/src/share/vm/runtime/arguments.cpp Tue Nov 02 16:02:46 2010 -0700 @@ -957,26 +957,65 @@ } } +void Arguments::check_compressed_oops_compat() { +#ifdef _LP64 + assert(UseCompressedOops, "Precondition"); +# if defined(COMPILER1) && !defined(TIERED) + // Until c1 supports compressed oops turn them off. + FLAG_SET_DEFAULT(UseCompressedOops, false); +# else + // Is it on by default or set on ergonomically + bool is_on_by_default = FLAG_IS_DEFAULT(UseCompressedOops) || FLAG_IS_ERGO(UseCompressedOops); + + // Tiered currently doesn't work with compressed oops + if (TieredCompilation) { + if (is_on_by_default) { + FLAG_SET_DEFAULT(UseCompressedOops, false); + return; + } else { + vm_exit_during_initialization( + "Tiered compilation is not supported with compressed oops yet", NULL); + } + } + + // XXX JSR 292 currently does not support compressed oops + if (EnableMethodHandles) { + if (is_on_by_default) { + FLAG_SET_DEFAULT(UseCompressedOops, false); + return; + } else { + vm_exit_during_initialization( + "JSR292 is not supported with compressed oops yet", NULL); + } + } + + // If dumping an archive or forcing its use, disable compressed oops if possible + if (DumpSharedSpaces || RequireSharedSpaces) { + if (is_on_by_default) { + FLAG_SET_DEFAULT(UseCompressedOops, false); + return; + } else { + vm_exit_during_initialization( + "Class Data Sharing is not supported with compressed oops yet", NULL); + } + } else if (UseSharedSpaces) { + // UseSharedSpaces is on by default. With compressed oops, we turn it off. + FLAG_SET_DEFAULT(UseSharedSpaces, false); + } + +# endif // defined(COMPILER1) && !defined(TIERED) +#endif // _LP64 +} + void Arguments::set_tiered_flags() { if (FLAG_IS_DEFAULT(CompilationPolicyChoice)) { FLAG_SET_DEFAULT(CompilationPolicyChoice, 2); } - if (CompilationPolicyChoice < 2) { vm_exit_during_initialization( "Incompatible compilation policy selected", NULL); } - -#ifdef _LP64 - if (FLAG_IS_DEFAULT(UseCompressedOops) || FLAG_IS_ERGO(UseCompressedOops)) { - UseCompressedOops = false; - } - if (UseCompressedOops) { - vm_exit_during_initialization( - "Tiered compilation is not supported with compressed oops yet", NULL); - } -#endif - // Increase the code cache size - tiered compiles a lot more. + // Increase the code cache size - tiered compiles a lot more. if (FLAG_IS_DEFAULT(ReservedCodeCacheSize)) { FLAG_SET_DEFAULT(ReservedCodeCacheSize, ReservedCodeCacheSize * 2); } @@ -2835,6 +2874,7 @@ return JNI_OK; } + // Parse entry point called from JNI_CreateJavaVM jint Arguments::parse(const JavaVMInitArgs* args) { @@ -2977,17 +3017,6 @@ PrintGC = true; } -#if defined(_LP64) && defined(COMPILER1) && !defined(TIERED) - UseCompressedOops = false; -#endif - -#if defined(_LP64) - if ((DumpSharedSpaces || RequireSharedSpaces) && UseCompressedOops) { - // Disable compressed oops with shared spaces - UseCompressedOops = false; - } -#endif - // Set object alignment values. set_object_alignment(); @@ -3002,13 +3031,10 @@ set_ergonomics_flags(); #ifdef _LP64 - // XXX JSR 292 currently does not support compressed oops. - if (EnableMethodHandles && UseCompressedOops) { - if (FLAG_IS_DEFAULT(UseCompressedOops) || FLAG_IS_ERGO(UseCompressedOops)) { - UseCompressedOops = false; - } + if (UseCompressedOops) { + check_compressed_oops_compat(); } -#endif // _LP64 +#endif // Check the GC selections again. if (!check_gc_consistency()) { diff -r f5c8d6e5bfee -r 9de67bf4244d src/share/vm/runtime/arguments.hpp --- a/src/share/vm/runtime/arguments.hpp Mon Nov 01 10:49:14 2010 -0700 +++ b/src/share/vm/runtime/arguments.hpp Tue Nov 02 16:02:46 2010 -0700 @@ -291,6 +291,8 @@ // Tiered static void set_tiered_flags(); + // Check compressed oops compatibility with other flags + static void check_compressed_oops_compat(); // CMS/ParNew garbage collectors static void set_parnew_gc_flags(); static void set_cms_and_parnew_gc_flags();