当前位置: 首页 > news >正文

GC 的判定方法

Java 中 GC(Garbage Collection)判定对象是否可回收的方法,包括原理、常用算法、优缺点,让你彻底理解 JVM 是如何判断一个对象可以被垃圾回收的。

1. GC 判定的核心问题

在 Java 中,GC 的核心任务是:

判断哪些对象已经不再被引用,可以安全地释放内存。

JVM 需要一种机制来判断对象是否存活(可达)还是死亡(不可达)。


2. 常见判定方法

Java 中主要有两种判定对象是否可回收的方法:

2.1 引用计数法(Reference Counting)

原理

  • 每个对象维护一个引用计数器
  • 当有一个地方引用它时,计数器 +1。
  • 当引用失效时,计数器 -1。
  • 当计数器为 0 时,说明对象不可达,可以回收。

优点

  • 实现简单,判定效率高。
  • 对象可以立即被回收,不需要等待 GC 扫描。

缺点

  • 无法解决循环引用问题
    class Node {Node next;
    }Node a = new Node();
    Node b = new Node();
    a.next = b;
    b.next = a; // 循环引用
    即使 a 和 b 不再被外部引用,它们的计数器仍然 > 0,导致无法回收。

结论

  • Java 的主流 GC 不使用引用计数法,但在一些语言(如 Python)中仍有应用。

2.2 可达性分析法(Reachability Analysis)

原理

  • 以一组称为 GC Roots 的对象为起点,沿着引用链向下搜索。
  • 能够从 GC Roots 到达的对象,称为可达对象(存活)。
  • 无法到达的对象,称为不可达对象(死亡,可回收)。

GC Roots 常见类型

  1. 虚拟机栈中引用的对象(方法参数、局部变量等)。
  2. 方法区中类的静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中 JNI 引用的对象。
  5. 正在运行的线程对象
  6. 类加载器引用的对象。

优点

  • 能够解决循环引用问题。
  • 是 Java GC 的主流判定方法。

缺点

  • 需要从 GC Roots 遍历整个对象图,开销比引用计数法大。

3. 判定流程(可达性分析法)

  1. 确定 GC Roots 集合
  2. 从 GC Roots 出发,遍历引用链
  3. 标记所有可达对象
  4. 未被标记的对象即为不可达对象 → 可回收。

4. 特殊情况:对象的“自救”

在可达性分析中,如果对象不可达,并不一定立刻被回收:

  • JVM 会调用对象的 finalize() 方法(如果重写了)。
  • 在 finalize() 中,如果对象重新建立引用链(如赋值给 GC Roots 可达对象),它可以“复活”。
  • 但 finalize() 只会被调用一次,且不推荐使用(性能差、不可预测)。

5. 总结对比

方法原理优点缺点Java 是否使用
引用计数法计数器记录引用次数实现简单,判定快循环引用无法回收
可达性分析法从 GC Roots 遍历引用链可解决循环引用遍历开销大

6. 总结

  • Java GC 判定对象可回收主要使用可达性分析法
  • GC Roots 是判定的起点,沿引用链遍历对象图。
  • 引用计数法简单但有循环引用问题,因此 Java 不采用。
  • 对象在被判定为不可达后,可能通过 finalize() 方法短暂“自救”,但不推荐依赖此机制。
http://www.dtcms.com/a/517071.html

相关文章:

  • 网站建设 鼠标英文手机商城网站建设
  • 彩票网站怎么做收银网站统计代码放哪里
  • 惠州网站设计方案响应式网站可以做缩放图吗
  • 深度学习的一些基本概念
  • 移动端性能监控探索:iOS RUM SDK 技术架构与实践
  • seo外链网站大全汕头市网络优化推广平台
  • 番禺区网站建设flash网站管理系统
  • Python+Requests接口测试教程(1):Fiddler抓包工具
  • 手机端网站怎么做的网站建设海南
  • UART、RS232、RS485、I2C 的区别及工程应用场景
  • 网站多数关键词做六个网站静态页多少钱
  • 高密网站开发公司做网络营销
  • 数据科学每日总结--Day2--区块链与模型了解
  • wordpress 友情链接小工具seo服务收费
  • 微信生态新机遇:视频号推客模式助力商家突围
  • Product Hunt 每日热榜 | 2025-10-22
  • 淘宝客网站免费做网站设计什么价位
  • 重庆品牌服装网站建设大发快三网站自做
  • 智冠宝企业网站管理系统如何免费制作一个网站
  • 网站的信息架构东海县建设局网站
  • 代码模版 网站镇江网页制作
  • 收费网站空间单位网站建设的重要性
  • 做不做我女朋友的网站上海的公司
  • 【FPGA】设计流程——Verilog输入
  • UV工具安装配置使用教程
  • 餐饮SaaS系统:一站式智慧餐饮解决方案,赋能多场景运营
  • 在网盘上怎么做自己的网站阜宁企业网站建设
  • Vue2学习笔记(上)
  • JavaScript 数组方法和属性详解
  • 每日算法刷题Day77:10.22:leetcode 二叉树bfs18道题,用时3h