首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MetaSpace在Java8中的用途是什么?

MetaSpace在Java8中的用途是什么?
EN

Stack Overflow用户
提问于 2014-06-06 04:28:53
回答 3查看 52.6K关注 0票数 64

我知道他们已经用Java8中的PermGen取代了MetaSpace。

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-06 06:12:27

默认情况下是否收集MetaSpace?

是的,GC将在metaspace上运行,当它满员时,它还会动态地增加(如果允许)为元数据分配的内存。

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

改进是随着元空间的动态扩展而进行的,这是permgen无法做到的。

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

基于对metaspace的描述,它只使用本机内存(不分页)。

基于(链接在这里)的研究,很明显,引入metaspace并不一定能解决OOM问题,它最多只能解决这个问题,它试图动态地调整元内存的大小,以容纳越来越多的类,这些类被加载到无法控制的增长中可能产生的副作用(只要本机内存允许)。

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

非常感谢皮埃尔-胡格·夏博诺。

票数 59
EN

Stack Overflow用户

发布于 2014-06-06 05:05:51

答复:

  1. 默认情况下,如果Metaspace内存到达MaxMetaspaceSize,就会收集它。这个参数最初是无限的。限制是你机器中的内存。但是,当不再需要类和类加载器时,内存会自动释放。只有当您怀疑ClassLoader存在内存泄漏时,才需要对此参数进行调优。
  2. MetaSpece使用本机内存,内存中有指针的组织使得GC比旧的PermGen内存更快。
  3. 不,这意味着JVM像普通C程序一样使用内存,而不使用java对象的虚拟内存空间。记忆似乎只受到机器的限制。注意,如果需要的话,机器的内存可以交换到磁盘。
  4. 如果设置参数MaxMetaspaceSize,则可以获得OutOfMemory;如果不设置该参数,则如果进程分配了所有机器内存(包括交换空间),则可以获得该参数。
票数 15
EN

Stack Overflow用户

发布于 2014-06-06 05:31:54

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

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

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

其主要目标是删除permgen,这样用户就不必考虑对其进行正确的调整。

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

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

  1. 即使是MetaSpace也会耗尽内存?

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24074164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档