在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可以增加内存?

提前致谢

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

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

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

改进是随着元代空间的dynamic扩展,这是permgen无法做到的。

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

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

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

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

非常感谢Pierre – Hugues Charbonneau。

作为回应:

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

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

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

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

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

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

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

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

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

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

  4. 即使MetaSpace可以用尽内存?

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