java - Java 8 中的 MetaSpace 有什么用?

标签 java garbage-collection java-8

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

  1. MetaSpace 是否默认被 GC 收集?
  2. 连PermGen都是GC收集的,加了-XX:+CMSClassUnloadingEnabled之类的args,那MetaSpace有什么比PermGen更好的地方呢?
  3. MetaSpace 是基于本地内存的,所以它会将 java 对象保存在磁盘上而不是 VM 上?
  4. 即使 MetaSpace 也会耗尽内存?如果再次这样,我会得到 OutOfMemoryException
  5. 默认情况下,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/

相关文章:

java - Android 中动态删除选项卡

android - 垃圾收集器可以释放单例实例吗? (以及为什么或如何避免)

performance - 有关GC的任何硬数据与显式内存管理性能之间的关系?

java - 如何在Java 8中替换以下代码?

java - 如何匹配流元素但不存在则返回false?

java - Java 8 中函数类型全等 lambda 表达式的使用

java - 无法解析类引用 org/openqa/selenium/WebDriver

Java 可选的 getter 在模型映射器中不起作用

java - 使用 sleep 能否保证线程的执行顺序?

javascript - JavaScript Blob 对象什么时候被垃圾回收?