为什么MetaSpace Size是Used MetaSpace的两倍?

时间:2016-08-22 16:19:50

标签: java memory jvm out-of-memory metaspace

我编写了一个模拟MetaSpace OOM的程序。但我发现MetaSpace Size几乎总是Used MetaSpace的两倍。为什么呢?

我使用标记-XX:MaxMetaspaceSize=50m运行我的程序,当Used MetaSpace达到约25M而不是50M时,程序抛出OOM,为什么?

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为以下两个实验将解释 MetaSpace Size Used MetaSpace 之间的差距是什么意思:

EXP-1 :每个ClassLoader加载一个类,我得到了这个: enter image description here

EXP-2 :每个ClassLoader加载五个类,我得到了这个: enter image description here

正如 Java 8 document 所说:

  

从操作系统请求空间,然后分成块。类加载器从其块中为元数据分配空间(块绑定到特定的类加载器)。

我认为这意味着一个块通常可以包含多个类,因此当您为每个ClassLoader加载更多类时,MetaSpace Size的利用率会增加。

您可以使用以下命令运行 code here 来重新显示结果:

java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000

注意:确保加载的所有类都不应出现在CLASSPATH(通常包括当前目录)中,或者这些类将由APPClassLoader而不是自定义的ClassLoader加载。

答案 1 :(得分:0)

好问题; - )

看看这篇非常好的文章。

PermGenSpace vs MetaSpace