我编写了一个模拟MetaSpace OOM的程序。但是我发现MetaSpace Size几乎总是比Used MetaSpace大两倍。为什么?
我使用标志-XX:MaxMetaspaceSize=50m运行我的程序,当Used MetaSpace达到25M而不是50M时,程序会抛出OOM,为什么?

发布于 2016-08-23 09:10:52
我认为以下两个实验将解释MetaSpace大小与使用MetaSpace之间的差距意味着什么:
EXP-1:每个ClassLoader加载一个类,我得到以下内容:

EXP-2:每个ClassLoader加载5个类,我得到了以下内容:

正如Java 8文档所说:
从操作系统中请求空间,然后将其划分为块。类加载器从其块中为元数据分配空间(块绑定到特定的类加载器)。
我认为这意味着块通常包含多个类,因此MetaSpace大小的利用率随着每个ClassLoader加载更多类而增加。
可以通过使用命令运行代码在这里来重新显示结果:
java -XX:MaxMetaspaceSize=50m MetadataOOMSimulator 100000000关注点:确保所有类都不会出现在CLASSPATH中(通常包括当前目录),否则这些类将由APPClassLoader加载,而不是自定义的ClassLoader。
发布于 2016-08-23 03:30:14
https://stackoverflow.com/questions/39084331
复制相似问题