【大白话说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;
    }
}
相关推荐
接着奏乐接着舞1 小时前
java jvm知识点
java·开发语言·jvm
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第55题】【JVM篇】第15题:JVM有哪些垃圾收集算法?
java·jvm·算法·面试
摇滚侠1 小时前
Java 基础面试题 真正的 offer 偏方 Java 基础 Java 高级
java·开发语言
蚰蜒螟1 小时前
深入剖析 OpenJDK 17 解释器中的安全点(Safepoint)进入与退出机制
java·开发语言·安全
Generalzy1 小时前
为什么 Go 的注释,能控制编译器?
java·python·golang
Galsk1 小时前
Linux零拷贝
java·linux·服务器·面试
李剑一1 小时前
华为二面稳了!面试官:请详细说明一下前端性能指标(FCP/LCP/CLS/TTI/TBT),如何采集、解读与优化?
前端·面试
Lucky_ldy1 小时前
C语言学习: 自定义类型—联合和枚举
c语言·学习·算法
gumichef1 小时前
栈和队列(2)
数据结构·算法·链表