Why MetaSpace Size is twice as big as Used MetaSpace?

吃可爱长大的小学妹 提交于 2019-12-07 16:08:28

问题


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?


回答1:


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:

Space is requested from the OS and then divided into chunks. A class loader allocates space for metadata from its chunks (a chunk is bound to a specific class loader).

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:

java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000

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.




回答2:


Good question ;-)

Have a look at this pretty good article.

PermGenSpace vs MetaSpace



来源:https://stackoverflow.com/questions/39084331/why-metaspace-size-is-twice-as-big-as-used-metaspace

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!