【大白话说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;
    }
}
相关推荐
程序员黑豆3 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
江畔柳前堤5 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
hey_sml5 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo5 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore6 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
萧瑟余晖6 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才7 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio7 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考7 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX8 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm