diff -r acb36277a784 -r c8ab058dcf1f src/hotspot/share/memory/metaspace.cpp --- a/src/hotspot/share/memory/metaspace.cpp Thu Mar 15 21:26:55 2018 +0100 +++ b/src/hotspot/share/memory/metaspace.cpp Mon Mar 19 11:38:45 2018 +0100 @@ -113,6 +113,7 @@ } else if (size == ClassMediumChunk) { return MediumIndex; } else if (size > ClassMediumChunk) { + // A valid humongous chunk size is a multiple of the smallest chunk size. assert(is_aligned(size, ClassSpecializedChunk), "Invalid chunk size"); return HumongousIndex; } @@ -124,6 +125,7 @@ } else if (size == MediumChunk) { return MediumIndex; } else if (size > MediumChunk) { + // A valid humongous chunk size is a multiple of the smallest chunk size. assert(is_aligned(size, SpecializedChunk), "Invalid chunk size"); return HumongousIndex; } @@ -299,10 +301,7 @@ Metachunk* free_chunks_get(size_t chunk_word_size); #define index_bounds_check(index) \ - assert(index == SpecializedIndex || \ - index == SmallIndex || \ - index == MediumIndex || \ - index == HumongousIndex, "Bad index: %d", (int) index) + assert(is_valid_chunktype(index), "Bad index: %d", (int) index) size_t num_free_chunks(ChunkIndex index) const { index_bounds_check(index); @@ -2648,25 +2647,13 @@ } ChunkIndex ChunkManager::list_index(size_t size) { - if (size_by_index(SpecializedIndex) == size) { - return SpecializedIndex; - } - if (size_by_index(SmallIndex) == size) { - return SmallIndex; - } - const size_t med_size = size_by_index(MediumIndex); - if (med_size == size) { - return MediumIndex; - } - - assert(size > med_size, "Not a humongous chunk"); - return HumongousIndex; + return get_chunk_type_by_size(size, is_class()); } size_t ChunkManager::size_by_index(ChunkIndex index) const { index_bounds_check(index); assert(index != HumongousIndex, "Do not call for humongous chunks."); - return _free_chunks[index].size(); + return get_size_for_nonhumongous_chunktype(index, is_class()); } void ChunkManager::locked_verify_free_chunks_total() { @@ -5244,37 +5231,39 @@ // The following test is placed here instead of a gtest / unittest file // because the ChunkManager class is only available in this file. void ChunkManager_test_list_index() { - ChunkManager manager(true); - - // Test previous bug where a query for a humongous class metachunk, - // incorrectly matched the non-class medium metachunk size. { - assert(MediumChunk > ClassMediumChunk, "Precondition for test"); - - ChunkIndex index = manager.list_index(MediumChunk); - - assert(index == HumongousIndex, - "Requested size is larger than ClassMediumChunk," - " so should return HumongousIndex. Got index: %d", (int)index); - } - - // Check the specified sizes as well. - { - ChunkIndex index = manager.list_index(ClassSpecializedChunk); - assert(index == SpecializedIndex, "Wrong index returned. Got index: %d", (int)index); - } - { - ChunkIndex index = manager.list_index(ClassSmallChunk); - assert(index == SmallIndex, "Wrong index returned. Got index: %d", (int)index); - } - { - ChunkIndex index = manager.list_index(ClassMediumChunk); - assert(index == MediumIndex, "Wrong index returned. Got index: %d", (int)index); - } - { - ChunkIndex index = manager.list_index(ClassMediumChunk + 1); - assert(index == HumongousIndex, "Wrong index returned. Got index: %d", (int)index); - } + // Test previous bug where a query for a humongous class metachunk, + // incorrectly matched the non-class medium metachunk size. + { + ChunkManager manager(true); + + assert(MediumChunk > ClassMediumChunk, "Precondition for test"); + + ChunkIndex index = manager.list_index(MediumChunk); + + assert(index == HumongousIndex, + "Requested size is larger than ClassMediumChunk," + " so should return HumongousIndex. Got index: %d", (int)index); + } + + // Check the specified sizes as well. + { + ChunkManager manager(true); + assert(manager.list_index(ClassSpecializedChunk) == SpecializedIndex, "sanity"); + assert(manager.list_index(ClassSmallChunk) == SmallIndex, "sanity"); + assert(manager.list_index(ClassMediumChunk) == MediumIndex, "sanity"); + assert(manager.list_index(ClassMediumChunk + ClassSpecializedChunk) == HumongousIndex, "sanity"); + } + { + ChunkManager manager(false); + assert(manager.list_index(SpecializedChunk) == SpecializedIndex, "sanity"); + assert(manager.list_index(SmallChunk) == SmallIndex, "sanity"); + assert(manager.list_index(MediumChunk) == MediumIndex, "sanity"); + assert(manager.list_index(MediumChunk + SpecializedChunk) == HumongousIndex, "sanity"); + } + + } + } #endif // !PRODUCT