GC是否从Metaspace收集垃圾?

gst*_*low 6 java garbage-collection dispose java-8

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

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

正如我所知,Metaspace是垃圾收集(/sf/answers/1685275231/)

谁从Metaspace收集垃圾?

Hol*_*ger 5

我认为您的困惑源自俗语“垃圾收集”,该词已被广泛使用,但并未真正描述托管环境中发生的情况。

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

  • 识别属于垃圾的对象,这实际上是确定哪些对象可访问的过程(读取:非垃圾),并将未遇到的所有内容都视为垃圾
  • 将对象引用排队到参考队列和/或触发完成(如有必要)
  • 回收以前被垃圾占用的内存,这也可能是相反的方式:有时,将活动对象移动到其他内存空间

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

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

因此,当Metaspace的大小达到极限时,将触发垃圾回收,但是对于上面的前两个项目符号,它将不会处理Metaspace,因为不是Metaspace可以告诉您a是否Class已变得未使用。这将是一个普通的垃圾收集,但它将是“完整GC”或当前使用的GC算法所具有的术语,该模式包括在包含类和类加载器的内存段(也称为“生成”)中收集垃圾。

一旦ClassClassLoader堆实例都被收集,其相关联的元空间数据可以回收以及在清理期间。

  • @amarnathharish 你可以这样看,或者你认为要回收元空间中的内存,它*需要*收集老年代(以识别无法访问的类),而在由于老年代已满而收集老年代时,有关可回收元空间的知识工件是免费的副产品。 (2认同)