RFR: 8170395: Metaspace initialization queries the wrong chunk freelist
stefan.karlsson at oracle.com
Mon Nov 28 13:52:20 UTC 2016
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
# assert(size > free_chunks(MediumIndex)->size()) failed: Not a
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
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),
More information about the hotspot-dev