Java 8中MetaSpace的用途是什么?
我知道他们已经用Java 8中的MetaSpace替换了PermGen。但是我有几个问题:
- 默认情况下是否收集MetaSpace?
- 甚至PermGen都是通过添加args这样的GC收集的
-XX:+CMSClassUnloadingEnabled
,那么什么使MetaSpace比PermGen更好呢? - MetaSpace基于本机内存,因此它将Java对象保留在磁盘上而不是VM上吗?
- 甚至MetaSpace也会耗尽内存?如果是这样,我会得到的
OutOfMemoryException
。 - 默认情况下,MetaSpace可以随着内存的增加而增长吗?
提前致谢
回答:
默认情况下是否收集MetaSpace?
是的,GC会在元空间变满时在元空间上运行,它还会动态增加(如果允许)分配给元数据的内存。
甚至通过添加-XX:+
CMSClassUnloadingEnabled之类的参数来收集PermGen的GC,那么什么使MetaSpace比PermGen更好呢?
改进之处在于元空间的动态扩展,而这是permgen无法做到的。
MetaSpace基于本机内存,因此它将Java对象保留在磁盘上而不是VM上吗?
根据对元空间的描述,它仅使用本机内存(不分页)。
根据Pierre-Hugues
Charbonneau(链接)的研究,很明显,元空间的引入并不一定解决OOM问题,它充其量只是解决该问题的绷带,它试图动态调整元空间的内存大小以适应越来越多的类被加载,可能会产生不可控制地增长的副作用(只要本地内存允许)。
通过将MaxMetaspaceSize
参数设置为JVM并运行提供的示例程序,可以实现著名的OOM错误。
非常感谢Pierre-Hugues Charbonneau。
以上是 Java 8中MetaSpace的用途是什么? 的全部内容, 来源链接: utcz.com/qa/401779.html