【大白话说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 分钟前
敏感数据查询:SHA-256 还是 HMAC-SHA256
算法
万年咸鱼3 分钟前
public class 和 class 的区别详解
java
焦虑的说说3 分钟前
redis知识汇总
java·redis
Wang's Blog8 分钟前
Java 接入Redis: 密码认证与远程连接配置
java·服务器·redis
SunnyDays101123 分钟前
Java 拆分 Word 文档教程:按页、分页符和分节符拆分
java·word·分页·拆分
林川~0124 分钟前
Unity 反射(Reflection)从原理到实战:一篇讲透原理、用法、实战案例与性能优化
面试·性能优化·反射·il2cpp·type
彧azz25 分钟前
Java学习记录:判断语句
java·笔记·学习·算法
企业数字化笔记28 分钟前
一批相同的电脑怎么建账?数量管理、单件编码和拆分规则
java·后端·电脑
alphaTao29 分钟前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode