我知道他们在 Java 8 中用 MetaSpace 替换了 PermGen。但我有几个问题:
- MetaSpace 是默认收集 GC 吗?
- 即使是 PermGen 也是通过添加诸如
-XX:+CMSClassUnloadingEnabled
之类的参数来收集 GC,那么是什么让 MetaSpace 比 PermGen 更好? - MetaSpace 基于本机内存,所以它将 java 对象保存在磁盘上而不是 VM 上?
- 即使是 MetaSpace 也会耗尽内存?如果再次出现,我将得到
OutOfMemoryException
。 - 默认情况下,MetaSpace 可以随着内存的增加而增长吗?
原文由 batman 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,GC 将在元空间变满时在元空间上运行,它还会动态增加(如果允许的话)为元数据分配的内存。
改进在于元空间的动态扩展,这是 permgen 无法做到的。
根据元空间的描述,它只使用本机内存(没有分页)。
根据 Pierre - Hugues Charbonneau( 链接在这里)的研究,很明显元空间的引入并不一定能解决 OOM 问题,它充其量只是解决问题的创可贴,它试图动态调整元空间内存的大小以适应越来越多的类被加载,可能会产生不受控制地增长的副作用(只要本机内存允许)。
我们可以通过将
MaxMetaspaceSize
参数设置为 JVM 并运行提供的示例程序来实现著名的 OOM 错误。非常感谢 Pierre - Hugues Charbonneau。