src/share/vm/memory/metaspace.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/memory/metaspace.cpp	Fri Dec 19 10:02:45 2014
--- new/src/share/vm/memory/metaspace.cpp	Fri Dec 19 10:02:45 2014

*** 3167,3177 **** --- 3167,3179 ---- if (SharedReadWriteSize < MetaspaceShared::min_rw_size){ report_out_of_shared_space(SharedReadWrite); } // the min_misc_data_size and min_misc_code_size estimates are based on ! // MetaspaceShared::generate_vtable_methods(). + // The minimum size only accounts for the vtable methods. Any size less than the + // minimum required size would cause vm crash when allocating the vtable methods. uint min_misc_data_size = align_size_up( MetaspaceShared::num_virtuals * MetaspaceShared::vtbl_list_size * sizeof(void*), max_alignment); if (SharedMiscDataSize < min_misc_data_size) { report_out_of_shared_space(SharedMiscData);
*** 3333,3342 **** --- 3335,3348 ---- // Allocate chunk for metadata objects Metachunk* new_chunk = get_initialization_chunk(NonClassType, word_size, vsm()->medium_chunk_bunch()); + // For dumping shared archive, report error if allocation has failed. + if (DumpSharedSpaces && new_chunk == NULL) { + report_insufficient_metaspace(MetaspaceAux::committed_bytes() + word_size * BytesPerWord); + } assert(!DumpSharedSpaces || new_chunk != NULL, "should have enough space for both chunks"); if (new_chunk != NULL) { // Add to this manager's list of chunks in use and current_chunk(). vsm()->add_chunk(new_chunk, true); }
*** 3346,3355 **** --- 3352,3366 ---- Metachunk* class_chunk = get_initialization_chunk(ClassType, class_word_size, class_vsm()->medium_chunk_bunch()); if (class_chunk != NULL) { class_vsm()->add_chunk(class_chunk, true); + } else { + // For dumping shared archive, report error if allocation has failed. + if (DumpSharedSpaces) { + report_insufficient_metaspace(MetaspaceAux::committed_bytes() + class_word_size * BytesPerWord); + } } } _alloc_record_head = NULL; _alloc_record_tail = NULL;

src/share/vm/memory/metaspace.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File