我知道他们在 Java 8 中已将 PermGen 替换为 MetaSpace。但我有几个问题:
- MetaSpace 是否默认被 GC 收集?
- 连PermGen都是GC收集的,加了
-XX:+CMSClassUnloadingEnabled
之类的args,那MetaSpace有什么比PermGen更好的地方呢? - MetaSpace 是基于本地内存的,所以它会将 java 对象保存在磁盘上而不是 VM 上?
- 即使 MetaSpace 也会耗尽内存?如果再次这样,我会得到
OutOfMemoryException
。 - 默认情况下,MetaSpace 可以随着内存的增加而增长?
最佳答案
Is MetaSpace by default is GC collected?
是的,当元空间满时,GC 会在元空间上运行,它也会 动态增加(允许)分配给的内存 元数据。
Even the PermGen is GC collected by adding the args like -XX:+CMSClassUnloadingEnabled, then what makes MetaSpace better than PermGen?
改进之处在于元空间的动态扩展 是 permgen 无法做到的。
MetaSpace is based on native memory, so it keeps the java objects on the disks rather than on VM?
根据元空间的描述,它只使用原生内存 (没有分页)。
根据 Pierre-Hugues Charbonneau (link here) 的研究,很明显,引入元空间并不一定能解决 OOM 问题,它充其量只是解决问题的方法,它试图动态调整元空间的大小内存来容纳越来越多的类,这些类被加载时可能会产生不可控制的增长(只要 native 内存允许)。
我们可以通过将 MaxMetaspaceSize
参数设置为 JVM 并运行提供的示例程序来实现著名的 OOM 错误。
非常感谢 Pierre - Hugues Charbonneau。
关于java - Java 8 中的 MetaSpace 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074164/