JVM–面试题6:如何判断对象可以被垃圾回收?

JVM 面试题:如何判断一个对象可以被垃圾回收?(2026 年最新主流回答)

目前 HotSpot JVM(以及几乎所有现代商用 JVM)统一采用 可达性分析算法(Reachability Analysis) 来判断对象是否“存活”,进而决定是否可以被垃圾回收。

1. 两种主要判断方式对比(面试常问第一层)

算法核心思想优点致命缺点HotSpot 是否采用
引用计数法对象被引用一次,计数器 +1;引用失效 -1;计数为 0 即回收实现简单,回收及时循环引用 导致内存泄漏不采用
可达性分析法GC Roots 为起点,沿着引用链搜索;不可达 → 可回收能很好解决循环引用问题需要暂停用户线程(STW)采用(主流)

一句话总结
因为引用计数法存在循环引用无法回收的致命缺陷,所以 Java 从诞生起就选择了可达性分析算法

2. 可达性分析算法核心流程(最常考点)

  1. 选定一组 GC Roots(根对象集合)
  2. 从这些根对象开始,沿着强引用向下搜索(深度优先 / 广度优先均可)
  3. 所有被搜索到的对象标记为可达(活的)
  4. 搜索结束后,堆中所有未被标记的对象 → 判定为垃圾,可以被回收

用图论表述:
如果从 GC Roots 到某个对象不存在任何路径(即不可达),则该对象可以被回收。

3. 哪些对象可以作为 GC Roots?(高频背诵点)

HotSpot JVM 中常见的 GC Roots(2026 年仍然是这几类,顺序基本按重要性排列):

序号GC Roots 类型典型例子是否跨代引用常见
1虚拟机栈(栈帧)中引用的对象方法中的局部变量、方法参数、临时变量非常常见
2方法区中类静态属性引用的对象public static User user;常见
3方法区中常量引用的对象字符串常量池中的字符串字面量(String Table)常见
4本地方法栈中 JNI(Native 方法)引用的对象native 方法中使用的对象较少见
5JVM 内部的引用Class 对象、系统类加载器、常驻异常对象(如 NullPointerException)了解即可
6所有被同步锁(synchronized)持有的对象synchronized(obj) 中的 obj了解即可
7JMX、JVMTI 中用于实现调试、监控的引用一些监控工具的回调对象了解即可

面试最常问的前 4 条,背熟即可。

4. “可达性分析不可达” ≠ “马上死亡”(第二次筛选)

即使可达性分析判定为不可达,对象也不一定马上被回收,要经历两次标记过程(经典的“缓刑”机制):

  1. 第一次标记 + 可选的 finalize() 筛选
  • 如果对象没有覆盖 finalize() 方法,或者 finalize() 已经被执行过 → 直接进入死亡队列
  • 如果覆盖了 finalize() 且没执行过 → 放入 F-Queue 队列,由 Finalizer 线程低优先级执行
  1. 第二次标记
  • 在 finalize() 中重新建立引用链(比如把自己 this 赋值给某个静态变量或成员变量)→ 对象复活,从死亡队列移除
  • 没有复活 → 第二次标记 → 真正死亡,下次 GC 真正回收

注意

  • finalize() 是对象逃亡的最后机会,但极不推荐使用(性能差、时机不确定、不安全)
  • 从 JDK 9 开始,finalize() 已被标记为 deprecated,未来版本可能会移除

5. 简洁版标准回答(推荐背诵 30 秒版本)

面试官:JVM 如何判断对象可以被垃圾回收?
答:HotSpot JVM 使用可达性分析算法来判断。
以一组 GC Roots 为起点,沿着引用链进行搜索,从 GC Roots 不可达的对象就被判定为垃圾,可以被回收。
常见的 GC Roots 包括:

  1. 虚拟机栈中局部变量引用的对象
  2. 方法区中静态属性引用的对象
  3. 方法区常量引用的对象
  4. 本地方法栈中 JNI 引用的对象
    即使不可达,也要经历两次标记(包括 finalize() 逃逸机会),才会真正被回收。

6. 延伸加分点(中高级面试)

  • 三色标记算法(并发标记阶段使用,避免漏标、重复标)
  • SATB、Incremental Update(写屏障解决并发问题)
  • 跨代引用(年轻代 → 老年代的引用如何处理?Remembered Set / Card Table)
  • 根对象扫描的 STW 时间(CMS、G1、ZGC、Shenandoah 的优化对比)

你现在是准备初级/中级/高级面试?
或者想继续深挖某个垃圾收集器(G1/ZGC/Shenandoah)里是怎么处理 GC Roots 扫描的?可以直接告诉我,我继续给你针对性答案。

文章已创建 4802

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部