我知道他们在 Java 8 中用 MetaSpace 取代了 PermGen。但我有几个问题:
- MetaSpace默认是GC收集的吗?
- 甚至 PermGen 也是通过添加参数进行 GC 收集的,例如
-XX:+CMSClassUnloadingEnabled
,那么 MetaSpace 比 PermGen 更好的地方是什么?
- MetaSpace基于本机内存,因此它将java对象保存在磁盘上而不是VM上?
- 即使 MetaSpace 也会出现内存不足的情况吗?如果再这样我会得到
OutOfMemoryException
.
- 默认情况下,MetaSpace 可以随着内存的增加而增长吗?
MetaSpace默认是GC收集的吗?
是的,当元空间满了时,GC会在元空间上运行,它也会
动态增加(如果允许的话)分配的内存
元数据。
即使是 PermGen 也是通过添加 -XX:+CMSClassUnloadingEnabled 等参数进行 GC 收集的,那么 MetaSpace 比 PermGen 更好的原因是什么?
改进是通过元空间的动态扩展来实现的
这是permgen 无法做到的事情。
MetaSpace基于本机内存,因此它将java对象保存在磁盘上而不是VM上?
根据元空间的描述,它只使用本机内存
(无分页)。
基于 Pierre - Hugues Charbonneau 的研究(链接在这里 http://java.dzone.com/articles/java-8-permgen-metaspace),很明显元空间的引入并不一定能解决 OOM 问题,它充其量只是解决问题的创可贴,它试图动态调整元空间内存的大小以适应不断增长的类数量,这些类的加载可能会产生副作用不受控制地增长(只要本机内存允许)。
我们可以通过设置来实现著名的 OOM 错误MaxMetaspaceSize
JVM 参数并运行提供的示例程序。
非常感谢皮埃尔-雨格斯·夏博诺。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)