# HG changeset patch # User hseigel # Date 1382713991 14400 # Node ID 634715d59d9e7b09e09f5f592139afd48635c324 # Parent a6177f601c6471936d8b0dc685dd76c08c7bf74e# Parent e4f478e7781bee7e1d9b1e09d64f58c8d62f25d1 Merge diff -r e4f478e7781b -r 634715d59d9e src/share/vm/memory/metaspace.cpp --- a/src/share/vm/memory/metaspace.cpp Fri Oct 25 09:07:58 2013 +0200 +++ b/src/share/vm/memory/metaspace.cpp Fri Oct 25 11:13:11 2013 -0400 @@ -3312,6 +3312,11 @@ return result; } +size_t Metaspace::class_chunk_size(size_t word_size) { + assert(using_class_space(), "Has to use class space"); + return class_vsm()->calc_chunk_size(word_size); +} + void Metaspace::report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, MetadataType mdtype, TRAPS) { // If result is still null, we are out of memory. if (Verbose && TraceMetadataChunkAllocation) { @@ -3323,9 +3328,19 @@ MetaspaceAux::dump(gclog_or_tty); } + bool out_of_compressed_class_space = false; + if (is_class_space_allocation(mdtype)) { + Metaspace* metaspace = loader_data->metaspace_non_null(); + out_of_compressed_class_space = + MetaspaceAux::committed_bytes(Metaspace::ClassType) + + (metaspace->class_chunk_size(word_size) * BytesPerWord) > + CompressedClassSpaceSize; + } + // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support - const char* space_string = is_class_space_allocation(mdtype) ? "Compressed class space" : - "Metadata space"; + const char* space_string = out_of_compressed_class_space ? + "Compressed class space" : "Metaspace"; + report_java_out_of_memory(space_string); if (JvmtiExport::should_post_resource_exhausted()) { @@ -3338,7 +3353,7 @@ vm_exit_during_initialization("OutOfMemoryError", space_string); } - if (is_class_space_allocation(mdtype)) { + if (out_of_compressed_class_space) { THROW_OOP(Universe::out_of_memory_error_class_metaspace()); } else { THROW_OOP(Universe::out_of_memory_error_metaspace()); diff -r e4f478e7781b -r 634715d59d9e src/share/vm/memory/metaspace.hpp --- a/src/share/vm/memory/metaspace.hpp Fri Oct 25 09:07:58 2013 +0200 +++ b/src/share/vm/memory/metaspace.hpp Fri Oct 25 11:13:11 2013 -0400 @@ -192,6 +192,8 @@ AllocRecord * _alloc_record_head; AllocRecord * _alloc_record_tail; + size_t class_chunk_size(size_t word_size); + public: Metaspace(Mutex* lock, MetaspaceType type); @@ -252,6 +254,7 @@ static bool is_class_space_allocation(MetadataType mdType) { return mdType == ClassType && using_class_space(); } + }; class MetaspaceAux : AllStatic { diff -r e4f478e7781b -r 634715d59d9e src/share/vm/memory/universe.cpp --- a/src/share/vm/memory/universe.cpp Fri Oct 25 09:07:58 2013 +0200 +++ b/src/share/vm/memory/universe.cpp Fri Oct 25 11:13:11 2013 -0400 @@ -1029,7 +1029,7 @@ Handle msg = java_lang_String::create_from_str("Java heap space", CHECK_false); java_lang_Throwable::set_message(Universe::_out_of_memory_error_java_heap, msg()); - msg = java_lang_String::create_from_str("Metadata space", CHECK_false); + msg = java_lang_String::create_from_str("Metaspace", CHECK_false); java_lang_Throwable::set_message(Universe::_out_of_memory_error_metaspace, msg()); msg = java_lang_String::create_from_str("Compressed class space", CHECK_false); java_lang_Throwable::set_message(Universe::_out_of_memory_error_class_metaspace, msg());