RFR: 8170395: Metaspace initialization queries the wrong chunk freelist

Michail Chernov michail.chernov at oracle.com
Mon Nov 28 19:47:45 UTC 2016

Hi Stefan, 

Since the bug was caught in existing test, I don't see any reason to make additional test for this case. Thanks for explanation! 

----- Исходное сообщение ----- 
От: stefan.karlsson at oracle.com 
Кому: michail.chernov at oracle.com, hotspot-dev at openjdk.java.net 
Отправленные: Понедельник, 28 Ноябрь 2016 г 22:29:33 GMT +03:00 Ирак 
Тема: Re: RFR: 8170395: Metaspace initialization queries the wrong chunk freelist 

Hi Michail, 

On 2016-11-28 14:57, Michail Chernov wrote: 

Hi Stefan, 

Could you please add simple regression test for this case? 
The failure below was found with one of the test cases in: 

Is this enough or do you want an explicit regression test that simply invokes: 
java -XX:InitialBootClassLoaderMetaspaceSize=30720 -version ? 




On 28.11.2016 16:52, Stefan Karlsson wrote: 

Hi all, 

Please, review this patch to fix metaspace initialization. 


The fix for JDK-8169931 introduced a new assert to ensure that we always try to allocate chunks that are any of the three fixed sizes (specialized, small, medium) or a humongous chunk (if it is larger then the medium chunk size). 

During metaspace initialization an initial metaspace chunk is allocated. The size of some of the metaspace instances can be specified on the command line. For example: 
java -XX:InitialBootClassLoaderMetaspaceSize=30720 -version 

If this size is smaller than the medium chunk size and at the same time doesn't match the specialized or small chunk size, then we end up hitting the assert mentioned above: 
# Internal Error (/scratch/opt/jprt/T/P1/142848.erik/s/hotspot/src/share/vm/memory/metaspace.cpp:2359), pid=31643, tid=31646 
# assert(size > free_chunks(MediumIndex)->size()) failed: Not a humongous chunk 


The most important part of the fix is this line: 
+ // Adjust to one of the fixed chunk sizes (unless humongous) 
+ const size_t adjusted = adjust_initial_chunk_size(requested); 

which ensures that we always request either of a specialized, small, medium, or humongous chunk size, even if the requested size is neither of these. 

Most of the other code is refactoring to unify the non-class metaspace and the class metaspace code paths to get rid of some of the existing code duplication, bring the chunk size calculation nearer to the the actual chunk allocation, and make it easier to write a unit test for the new adjust_initial_chunk_size function. 


The patch for JDK-8169931 was backed out with JDK-8170355 and will be reintroduced as JDK-8170358 when this patch has been reviewed and pushed. 

Testing: jprt, unit test, parts of PIT testing (including CDS tests), failing test 


More information about the hotspot-dev mailing list