# HG changeset patch # User jwilhelm # Date 1433958299 -7200 # Node ID b091956d885c721b4d7d542b5b14b2dac7b068d1 # Parent 3300e511bc3a19cfcba7faf2ba8d8ee22e92cc39# Parent 57d4971ff1df179074dcb76cf7eaaaacd215ee01 Merge diff -r 3300e511bc3a -r b091956d885c src/share/vm/memory/metaspace.cpp --- a/src/share/vm/memory/metaspace.cpp Tue Jun 02 10:41:18 2015 +0200 +++ b/src/share/vm/memory/metaspace.cpp Wed Jun 10 19:44:59 2015 +0200 @@ -622,7 +622,8 @@ Metachunk* _chunks_in_use[NumberOfInUseLists]; Metachunk* _current_chunk; - // Maximum number of small chunks to allocate to a SpaceManager + // Number of small chunks to allocate to a manager + // If class space manager, small chunks are unlimited static uint const _small_chunk_limit; // Sum of all space in allocated chunks @@ -736,8 +737,6 @@ // Block allocation and deallocation. // Allocates a block from the current chunk MetaWord* allocate(size_t word_size); - // Allocates a block from a small chunk - MetaWord* get_small_chunk_and_allocate(size_t word_size); // Helper for allocations MetaWord* allocate_work(size_t word_size); @@ -2032,8 +2031,9 @@ size_t SpaceManager::calc_chunk_size(size_t word_size) { // Decide between a small chunk and a medium chunk. Up to - // _small_chunk_limit small chunks can be allocated. - // After that a medium chunk is preferred. + // _small_chunk_limit small chunks can be allocated but + // once a medium chunk has been allocated, no more small + // chunks will be allocated. size_t chunk_word_size; if (chunks_in_use(MediumIndex) == NULL && sum_count_in_chunks_in_use(SmallIndex) < _small_chunk_limit) { @@ -2101,7 +2101,7 @@ word_size, words_used, words_left); } - // Get another chunk + // Get another chunk out of the virtual space size_t grow_chunks_by_words = calc_chunk_size(word_size); Metachunk* next = get_new_chunk(word_size, grow_chunks_by_words); @@ -2432,43 +2432,6 @@ return next; } -/* - * The policy is to allocate up to _small_chunk_limit small chunks - * after which only medium chunks are allocated. This is done to - * reduce fragmentation. In some cases, this can result in a lot - * of small chunks being allocated to the point where it's not - * possible to expand. If this happens, there may be no medium chunks - * available and OOME would be thrown. Instead of doing that, - * if the allocation request size fits in a small chunk, an attempt - * will be made to allocate a small chunk. - */ -MetaWord* SpaceManager::get_small_chunk_and_allocate(size_t word_size) { - if (word_size + Metachunk::overhead() > small_chunk_size()) { - return NULL; - } - - MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); - MutexLockerEx cl1(expand_lock(), Mutex::_no_safepoint_check_flag); - - Metachunk* chunk = chunk_manager()->chunk_freelist_allocate(small_chunk_size()); - - MetaWord* mem = NULL; - - if (chunk != NULL) { - // Add chunk to the in-use chunk list and do an allocation from it. - // Add to this manager's list of chunks in use. - add_chunk(chunk, false); - mem = chunk->allocate(word_size); - - inc_used_metrics(word_size); - - // Track metaspace memory usage statistic. - track_metaspace_memory_usage(); - } - - return mem; -} - MetaWord* SpaceManager::allocate(size_t word_size) { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); @@ -3548,18 +3511,7 @@ } if (result == NULL) { - SpaceManager* sm; - if (is_class_space_allocation(mdtype)) { - sm = loader_data->metaspace_non_null()->class_vsm(); - } else { - sm = loader_data->metaspace_non_null()->vsm(); - } - - result = sm->get_small_chunk_and_allocate(word_size); - - if (result == NULL) { - report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL); - } + report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL); } // Zero initialize.