在Java 8中MetaSpace有什么用?

时间:2014-06-06 04:28:54

标签: java garbage-collection java-8

我知道他们已经用Java 8中的MetaSpace取代了PermGen。但是我几乎没有问题:

  1. 默认情况下,MetaSpace是否收集了GC?
  2. 即使PermGen是通过添加像-XX:+CMSClassUnloadingEnabled这样的args来收集GC,那么是什么让MetaSpace比PermGen更好?
  3. MetaSpace基于本机内存,因此它将java对象保留在磁盘而不是VM上?
  4. 甚至MetaSpace也会耗尽内存?如果是这样,我会得到OutOfMemoryException
  5. 默认情况下,MetaSpace可以随着内存的增加而增长?
  6. 提前致谢

3 个答案:

答案 0 :(得分:50)

  

默认情况下,MetaSpace是否收集GC?

是的,当GC变满时,GC将在元空间上运行,它也会 动态增加(给定允许)分配的内存  元数据。

  

即使PermGen是通过添加像-XX:+ CMSClassUnloadingEnabled这样的args来收集GC,那么是什么让MetaSpace比PermGen更好?

改进是随着元空间的动态扩展而来的 是permgen无法做到的事情。

  

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

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

根据Pierre-Hugues Charbonneau(link here)的研究,很明显,元空间的引入并不一定能解决OOM问题,它是一个叛变者。问题充其量,它试图动态调整元空间内存的大小,以适应越来越多的类,这些类可能会无法控制地增加可能的副作用(只要本机内存允许它)。

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

非常感谢Pierre - Hugues Charbonneau。

答案 1 :(得分:10)

回应:

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

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

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

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

答案 2 :(得分:6)

  1.   

    默认情况下,MetaSpace是否收集GC?

    一旦类元数据使用达到“MaxMetaspaceSize”(默认为"unlimited"),就会触发死类和类加载器的垃圾收集,因此需要进行适当的监视以限制此类GC的延迟或频率。

  2.   

    即使是PermGen也是通过添加args来收集GC的   -XX:+ CMSClassUnloadingEnabled,那么是什么让MetaSpace比PermGen更好?

    主要目标是移除permgen,以便用户无需考虑正确调整它的大小。

  3.   

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

    磁盘不是本机内存,而是存储设备。本机内存,在此上下文中是区域,是从Java堆遗留的进程的内存

  4.   

    甚至MetaSpace也会耗尽内存?

    是的,它受到机器内存量的限制。