我编写了一个模拟MetaSpace OOM的程序。但我发现MetaSpace Size
几乎总是Used MetaSpace
的两倍。为什么呢?
我使用标记-XX:MaxMetaspaceSize=50m
运行我的程序,当Used MetaSpace
达到约25M而不是50M时,程序抛出OOM,为什么?
答案 0 :(得分:1)
我认为以下两个实验将解释 MetaSpace Size 和 Used MetaSpace 之间的差距是什么意思:
EXP-1 :每个ClassLoader加载一个类,我得到了这个:
EXP-2 :每个ClassLoader加载五个类,我得到了这个:
正如 Java 8 document 所说:
从操作系统请求空间,然后分成块。类加载器从其块中为元数据分配空间(块绑定到特定的类加载器)。
我认为这意味着一个块通常可以包含多个类,因此当您为每个ClassLoader加载更多类时,MetaSpace Size的利用率会增加。
您可以使用以下命令运行 code here 来重新显示结果:
java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000
注意:确保加载的所有类都不应出现在CLASSPATH
(通常包括当前目录)中,或者这些类将由APPClassLoader而不是自定义的ClassLoader加载。
答案 1 :(得分:0)