gpt4 book ai didi

java - GC 是否从 Metaspace 收集垃圾?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:23 25 4
gpt4 key购买 nike

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

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

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

谁从 Metaspace 收集垃圾?

最佳答案

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

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

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

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

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

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

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

关于java - GC 是否从 Metaspace 收集垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26462136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com