我写了一个程序来模拟MetaSpace OOM。但我发现MetaSpace Size
几乎总是两倍大Used MetaSpace
. Why?
我用标志运行我的程序-XX:MaxMetaspaceSize=50m
,程序抛出OOM时Used MetaSpace
达到了25M左右而不是50M,为什么呢?
我认为下面的两个实验将解释两者之间的差距元空间大小 and 二手元空间 mean:
EXP-1: load one class per ClassLoader, I got this:
EXP-2: load five classes per ClassLoader, I got this:
As Java 8 文档 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html says:
从操作系统请求空间,然后将其划分为块。类加载器从其块中为元数据分配空间(块绑定到特定的类加载器)。
我认为这意味着一个块通常可以包含多个类,因此当每个类加载器加载更多类时,元空间大小的利用率会增加。
您可以通过运行重新显示结果代码在这里 https://drive.google.com/file/d/0Bx69N5pLghi8a1pabVlVa0QtRDg/view?usp=sharing使用命令:
java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000
注意力:确保所有被加载的类不应该出现在CLASSPATH
(通常包括当前目录),或者这些类将由APPClassLoader而不是自定义的ClassLoader加载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)