I wrote a program to simulate MetaSpace OOM. But I found that MetaSpace Size
is almost always twice as big as Used MetaSpace
. Why?
I run my program with flag -XX:MaxMetaspaceSize=50m
, the program throw OOM when Used MetaSpace
reached about 25M rather than 50M, Why?
I think the following two experiment will explain what does the gap between MetaSpace Size and Used MetaSpace mean:
EXP-1: load one class per ClassLoader, I got this:
EXP-2: load five classes per ClassLoader, I got this:
As Java 8 document says:
I think it means a chunk can contains usually more than one class, so utilization rate of MetaSpace Size grows as you load more classes per ClassLoader.
You can reappear the results by running code here using command:
Attention: make sure that all classes be loaded should not appear in
CLASSPATH
(usually include current directory), or those classes will be loaded by APPClassLoader rather than customized ClassLoader.Good question ;-)
Have a look at this pretty good article.
PermGenSpace vs MetaSpace