【大白话说Java面试题 第54题】【JVM篇】第14题:什么是可达性分析算法?

📌 PDF :大白话说Java面试题 --- 02-JVM篇

第14题:什么是可达性分析算法

📚 回答:

  • 核心流程
    可达性分析算法是 JVM 垃圾回收的核心机制之一,用于标记内存中的存活对象和垃圾对象。

1. GC Roots 的定义与作用
  • 定义

    • GC Roots 是一组特殊的对象,作为可达性分析的起点。
    • 它们包括以下几种类型:
      1. 静态变量 :被 static 修饰的变量。
      2. 局部变量:方法中的参数或局部变量。
      3. 常量:字符串常量池中的常量。
      4. JNI 引用:本地方法(Native Method)中的引用。
  • 作用

    • GC Roots 是垃圾回收的起点,只有从这些根节点能够直接或间接引用的对象才被认为是存活的。

2. 可达性分析的过程
  • 步骤详解

    1. 从 GC Roots 出发

      • JVM 会从所有的 GC Roots 开始遍历,找到所有直接引用的对象。
    2. 递归搜索

      • 对于每个直接引用的对象,继续查找它们引用的其他对象,直到所有可达对象都被标记为存活。
    3. 标记垃圾对象

      • 无法从 GC Roots 到达的对象被视为垃圾对象,等待被回收。

      💡 图示说明

      以下是一个简单的可达性分析过程的示意图:

    GC Roots

    Object A → Object B → Object C

    Object D → Object E

  • 在这个例子中,Object ABCDE 都是从 GC Roots 可达的,因此它们是存活对象。

  • 如果某个对象(如 Object F)没有任何引用指向它,则它是不可达的,会被标记为垃圾对象。


3. 源码解析
  • HotSpot VM 实现
    • 可达性分析算法在 HotSpot VM 中由 Mark-SweepMark-Compact 算法实现。
    • 具体逻辑可以参考 GenCollectedHeapConcurrentMarkSweepGeneration 模块。

4. 总结对比
特性 可达性分析算法
适用场景 判断对象是否存活,标记垃圾对象
优点 解决循环引用问题,适用于复杂对象图
缺点 遍历开销较大,可能导致 STW 时间较长

💡 代码示例

以下代码展示了可达性分析的基本思想:

java 复制代码
// 示例:模拟可达性分析
class GCRoots {
    static Object staticObj = new Object(); // 静态变量
    Object instanceObj = new Object();      // 实例变量
}

public class ReachabilityAnalysis {
    public static void main(String[] args) {
        GCRoots roots = new GCRoots();
        Object localObj = new Object(); // 局部变量

        // 这些对象都是从 GC Roots 可达的
        System.out.println("GC Roots: " + roots.staticObj + ", " + roots.instanceObj + ", " + localObj);

        // 当没有引用指向某个对象时,它将成为垃圾对象
        localObj = null;
    }
}
相关推荐
葫芦和十三36 分钟前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
To_OC3 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵6 小时前
[Python] 扩展欧几里得算法
python·数学·算法
狼爷7 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
葫芦和十三7 小时前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试
葫芦和十三7 小时前
图解 MongoDB 16|压缩:snappy、zstd 和 zlib 的取舍
后端·mongodb·面试
To_OC9 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
祎雪双十Gy11 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
labixiong11 小时前
实现一个能跑的迷你版Promise(一)
前端·javascript·面试
小锋java123411 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java