首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GC从Metaspace收集垃圾吗?

GC从Metaspace收集垃圾吗?
EN

Stack Overflow用户
提问于 2014-10-20 09:15:32
回答 1查看 4.9K关注 0票数 12

我一直认为垃圾收集器只清除堆,现在我认为是这样的。

在java 8中,permGen被删除,并被Metaspace取代。

据我所知,Metaspace是垃圾收集(https://stackoverflow.com/a/24075360/2674303)

谁在Metaspace收集垃圾?

EN

回答 1

Stack Overflow用户

发布于 2014-10-21 10:24:05

我认为,您的困惑源于“垃圾收集”这个口语化的术语,它被广泛使用,但并没有真正描述在托管环境中发生的事情。

内存管理是一个复杂的过程,简化后的过程是:

  • 标识垃圾对象,这实际上是一个确定哪些对象是可访问的过程(读:不是垃圾),并将所有未遇到的对象视为垃圾。
  • 对引用队列的对象引用和/或在必要时触发终结
  • 回收以前被垃圾占用的内存,而垃圾也可能是相反的方式:有时活动的对象被移动到不同的内存空间中。

因此,对于不包含Java对象的内存空间,前两点通常没有多大意义,这就是您的问题所在。解决前两点的算法通常只处理Java堆(定义为包含普通Java对象实例和类似结构化数据的空间)。

您所链接的声明“Metaspace is GCed”似乎主要解决了第三点。事实上,如果不再需要,Metaspace中的内存可能会被回收。这并不意味着它需要遍历Metaspace或类似的活动引用。显然,当类元数据的关联ClassClassLoader变得不可访问时,类元数据就过时了,因为它们都是生活在Java堆上的普通(好的,几乎)对象。

因此,当Metaspace大小达到极限时,垃圾收集将被触发,但对于上面的前两个项目,它将不会处理Metaspace,因为不能通过Metaspace来判断Class是否已被使用。它将是一个普通的垃圾收集,但它将是一个“完整的GC”,或者当前使用的GC算法对于包括在包含类和类加载器的内存段(也称为“生成”)中收集垃圾的模式的任何术语。

一旦收集了ClassClassLoader堆实例,它们相关的Metaspace数据也可以在清理期间被回收。

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

https://stackoverflow.com/questions/26462136

复制
相关文章

相似问题

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