--- old/src/share/vm/memory/metaspace.cpp 2015-06-19 00:27:23.694051055 +0900 +++ new/src/share/vm/memory/metaspace.cpp 2015-06-19 00:27:23.285055180 +0900 @@ -3197,6 +3197,14 @@ CompressedClassSpaceSize = align_size_down_bounded(CompressedClassSpaceSize, _reserve_alignment); set_compressed_class_space_size(CompressedClassSpaceSize); + + size_t min_metaspace_sz = InitialBootClassLoaderMetaspaceSize + + (MediumChunk * HeapWordSize); + if (!UseCompressedClassPointers && (min_metaspace_sz >= MaxMetaspaceSize)) { + FLAG_SET_ERGO(size_t, InitialBootClassLoaderMetaspaceSize, + min_metaspace_sz); + } + } void Metaspace::global_initialize() { --- old/src/share/vm/runtime/arguments.cpp 2015-06-19 00:27:25.104036835 +0900 +++ new/src/share/vm/runtime/arguments.cpp 2015-06-19 00:27:24.776040143 +0900 @@ -1522,6 +1522,20 @@ } // Check the CompressedClassSpaceSize to make sure we use compressed klass ptrs. if (UseCompressedClassPointers) { + size_t min_metaspace_sz = InitialBootClassLoaderMetaspaceSize + + (64 * K * HeapWordSize); // MediumChunk in bytes. + + if ((min_metaspace_sz + CompressedClassSpaceSize) > MaxMetaspaceSize) { + if (min_metaspace_sz >= MaxMetaspaceSize) { + vm_exit_during_initialization( + "InitialBootClassLoaderMetaspaceSize should be " + "less than MaxMetaspaceSize."); + } else { + FLAG_SET_ERGO(size_t, CompressedClassSpaceSize, + MaxMetaspaceSize - min_metaspace_sz); + } + } + if (CompressedClassSpaceSize > KlassEncodingMetaspaceMax) { warning("CompressedClassSpaceSize is too large for UseCompressedClassPointers"); FLAG_SET_DEFAULT(UseCompressedClassPointers, false);