GC 会从元空间收集垃圾吗?

2024-04-02

我一直认为垃圾收集器只清除堆,现在我也这么认为。

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

据我了解元空间是垃圾收集的(https://stackoverflow.com/a/24075360/2674303 https://stackoverflow.com/a/24075360/2674303)

谁从元空间收集垃圾?


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

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

  • 识别哪些对象是垃圾,其实就是判断哪些对象是垃圾的过程可达的(读:不是垃圾)并认为所有没有遇到的东西都是垃圾
  • 如果需要,将对象引用排队到引用队列和/或触发终结
  • 回收以前被垃圾占用的内存,这也可能是相反的:有时活动的对象会被移动到不同的内存空间

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

您链接的声明“元空间已被GC”似乎主要解决了third观点。事实上,如果不再需要元空间中的内存,可能会被回收。这并不意味着它需要遍历元空间或类似内容内的实时引用。显然,当类元数据相关联时,它们就已经过时了。Class and ClassLoader变得无法访问,它们都是生活在 Java 堆上的普通(好吧,几乎)对象。

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

Once Class and ClassLoader堆实例已被收集,其关联的元空间数据也可以在清理期间回收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GC 会从元空间收集垃圾吗? 的相关文章

随机推荐