Java 8 中的 MetaSpace 有什么用?

新手上路,请多包涵

我知道他们在 Java 8 中用 MetaSpace 替换了 PermGen。但我有几个问题:

  1. MetaSpace 是默认收集 GC 吗?
  2. 即使是 PermGen 也是通过添加诸如 -XX:+CMSClassUnloadingEnabled 之类的参数来收集 GC,那么是什么让 MetaSpace 比 PermGen 更好?
  3. MetaSpace 基于本机内存,所以它将 java 对象保存在磁盘上而不是 VM 上?
  4. 即使是 MetaSpace 也会耗尽内存?如果再次出现,我将得到 OutOfMemoryException
  5. 默认情况下,MetaSpace 可以随着内存的增加而增长吗?

原文由 batman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 658
2 个回答

MetaSpace 是默认收集 GC 吗?

是的,GC 将在元空间变满时在元空间上运行,它还会动态增加(如果允许的话)为元数据分配的内存。

即使是 PermGen 也是通过添加诸如 -XX:+CMSClassUnloadingEnabled 之类的参数来进行 GC 收集的,那么是什么让 MetaSpace 比 PermGen 更好呢?

改进在于元空间的动态扩展,这是 permgen 无法做到的。

MetaSpace 基于本机内存,所以它将 java 对象保存在磁盘上而不是 VM 上?

根据元空间的描述,它只使用本机内存(没有分页)。

根据 Pierre - Hugues Charbonneau( 链接在这里)的研究,很明显元空间的引入并不一定能解决 OOM 问题,它充其量只是解决问题的创可贴,它试图动态调整元空间内存的大小以适应越来越多的类被加载,可能会产生不受控制地增长的副作用(只要本机内存允许)。

我们可以通过将 MaxMetaspaceSize 参数设置为 JVM 并运行提供的示例程序来实现著名的 OOM 错误。

非常感谢 Pierre - Hugues Charbonneau。

原文由 Anantha Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

作为回应:

  1. 默认情况下,如果 Metaspace 内存达到 MaxMetaspaceSize,就会收集它。此参数最初是无限制的。限制是您机器中的内存。但是当不再需要类和类加载器时,内存会自动释放。只有在怀疑ClassLoader存在内存泄漏的情况下才需要调优这个参数。

  2. MetaSpece 使用本机内存和内存中的指针组织使得 GC 比旧的 PermGen 内存更快。

  3. 不,这意味着 JVM 像普通 C 程序一样使用内存,而不使用 java 对象的虚拟内存空间。那似乎内存仅受机器限制。请注意,如果需要,可以将机器的内存交换到磁盘。

  4. 如果设置参数 MaxMetaspaceSize 则可以获得 OutOfMemory,如果不设置此参数则可以获得进程是否分配了所有机器内存(包括交换空间)。

原文由 Fernando Rincon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题