在Java 8中使用MetaSpace有什么用?

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

  • 默认情况下,MetaSpace是否收集了GC?
  • 即使是PermGen也是通过添加如-XX:+CMSClassUnloadingEnabled类的参数来收集GC,那么是什么让MetaSpace比PermGen更好?
  • MetaSpace基于本机内存,因此它将Java对象保留在磁盘上而不是VM上?
  • 即使MetaSpace可能会耗尽内存? 如果是这样,我会得到OutOfMemoryException
  • 默认情况下,MetaSpace可以增加内存?
  • 提前致谢


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

    是的,GC会在元数据空间变满时运行,它也会动态增加(考虑到它允许)为元数据分配的内存。

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

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

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

    基于元数据空间的描述,它只使用本地内存(无分页)。

    基于Pierre-Hugues Charbonneau的研究(此处链接),明确指出引入metaspace并不一定解决OOM问题,它充其量只是解决问题的方法,它试图动态调整metaspace存储器的大小以适应增长可能会受到不可控制地增长的副作用(只要本机存储器允许),就会加载的类的数量。

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

    非常感谢Pierre - Hugues Charbonneau。


    作为回应:

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

  • MetaSpece使用本地内存,并且内存中的指针使得GC比旧的PermGen内存更快。

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

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


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

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

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

    主要目标是去除permgen,以便用户不必考虑正确调整大小。

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

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

  • 即使MetaSpace可能会耗尽内存?

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

  • 链接地址: http://www.djcxy.com/p/82845.html

    上一篇: What is the use of MetaSpace in Java 8?

    下一篇: XX:MaxPermSize with or without