在Java 8中MetaSpace有什么用?

bat*_*man 53 java garbage-collection java-8

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

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

提前致谢

Ana*_*rma 53

MetaSpace默认是GC收集的吗?

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

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

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

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

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

根据Pierre-Hugues Charbonneau的研究(链接在这里),它清楚地表明,元空间的引入并不一定能解决OOM问题,它最多只能解决这个问题,它试图动态调整元空间内存的大小来适应不断增长的问题.加载可能不受控制地增长的副作用的类的数量(只要本机存储器允许它).

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

非常感谢Pierre - Hugues Charbonneau.

  • **是的,GC会在元空间变满时在元空间上运行,它还会动态增加(如果允许)分配给元数据的内存。** GC会耗尽堆是否正常? (2认同)

Fer*_*con 12

作为回应:

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

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

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

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

  • @JigarJoshi 而且我刚刚测试过,如果元空间达到`MaxMetaspaceSize` 而不是`MetaspaceSize`,则默认情况下会收集它。 (2认同)

Raj*_*Raj 6

  1. MetaSpace默认是GC收集的吗?

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

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

    主要目标是删除permgen,以便用户不必考虑正确调整它的大小.

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

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

  4. 即使MetaSpace也会耗尽内存?

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

  • 哈哈点2让我发笑.我的一台生产服务器今天崩溃了两次,因为Metaspace使用了所有的RAM并推动其他所有内容进行交换.哦没有****让我想到如何调整Metaspace的大小:D (8认同)