GC是否从Metaspace收集垃圾?

时间:2014-10-20 09:15:33

标签: java garbage-collection java-8 dispose

总是我认为垃圾收集器只清除堆,现在我想是的。

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

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

谁从Metaspace收集垃圾?

1 个答案:

答案 0 :(得分:4)

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

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

  • 识别垃圾对象,这实际上是确定哪些对象可到达的过程(读取:不是垃圾)并将未遇到的所有内容视为垃圾
  • 如有必要,将对象引用排入引用队列和/或触发终结
  • 回收以前被垃圾占用的内存,也可能是另一种方式:有时将活动对象移动到不同的内存空间

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

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

因此,当Metaspace大小达到限制时,将触发垃圾收集,但是对于上面的前两个子弹,它将不会处理Metaspace,因为它不是Metaspace,它可以告诉您是否Class已经没用了。它将是一个普通的垃圾收集,但它将是一个“Full GC”或当前使用的GC算法对于模式的任何术语,包括在包含类和类加载器的内存段(也称为“生成”)内收集垃圾。

收集ClassClassLoader堆实例后,在清理过程中也可以回收关联的Metaspace数据。