RFR: 8170395: Metaspace initialization queries the wrong chunk freelist

Stefan Karlsson stefan.karlsson at oracle.com
Mon Nov 28 13:52:20 UTC 2016

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 
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