Java垃圾回收时如何判断一个对象是否可达

GC Roots是垃圾回收的起点,包括局部变量、静态属性、常量、JNI引用和活跃线程,通过引用链遍历对象图判断可达性,不可达对象被回收,特殊引用类型影响回收时机。

Java垃圾回收时如何判断一个对象是否可达

Java垃圾回收时判断一个对象是否可达,主要依靠可达性分析算法(Reachability Analysis)。这个机制从一组称为“GC Roots”的对象开始,向下搜索引用链,所有能被直接或间接引用到的对象被视为可达,不会被回收;反之,无法被访问到的对象则被认为是不可达的,可以被垃圾回收器回收。

什么是GC Roots?

GC Roots 是一组必须活跃的对象,它们是垃圾回收器进行可达性分析的起点。常见的 GC Roots 包括:

  • 正在执行的方法中的局部变量(帧中的引用)
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI 引用的对象
  • 活跃线程的引用

可达性分析过程

垃圾回收器会从上述的 GC Roots 出发,沿着引用关系遍历整个对象图。这个过程类似于图的遍历(如深度优先或广度优先):

  • 如果一个对象可以通过引用链从某个 GC Root 到达,它就是可达的,会被保留。
  • 如果没有任何路径可以从 GC Roots 到达某个对象,那它就被标记为不可达,在后续阶段会被回收。

例如:一个局部变量引用对象 A,A 又引用对象 B,B 引用对象 C。只要这个局部变量还存在(属于活动栈帧),A、B、C 都是可达的,即使没有其他引用。

立即学习Java免费学习笔记(深入)”;

Java垃圾回收时如何判断一个对象是否可达

晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

Java垃圾回收时如何判断一个对象是否可达25

查看详情 Java垃圾回收时如何判断一个对象是否可达

特殊情况处理

有些对象虽然技术上不可达,但 jvm 会在真正回收前尝试一次自救 —— 通过 finalize() 方法。不过该机制已被废弃,不推荐依赖。

另外,像软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)等特殊引用类型会影响可达性判断:

  • 强引用:只要存在,对象就不会被回收。
  • 软引用:内存不足时才回收。
  • 弱引用:只要发生垃圾回收,就会被回收。
  • 虚引用:随时可回收,主要用于跟踪回收状态。

基本上就这些。可达性分析是现代 JVM 垃圾回收的基础,它比简单的引用计数更准确,能有效处理循环引用的问题。理解 GC Roots 和引用链,对排查内存泄漏也很有帮助。

暂无评论

发送评论 编辑评论


				
上一篇
下一篇
text=ZqhQzanResources