java垃圾回收以可达性分析为核心,从gc roots出发标记存活对象,未被标记的不可达对象被回收;gc roots包括虚拟机栈、本地方法栈、方法区静态属性与常量池、同步锁对象等;清除策略分标记-清除、标记-整理、标记-复制三类;对象默认可回收,仅保留根可达者。

Java 垃圾回收(GC)通过“可达性分析”标记存活对象,再回收未被标记的对象——不是靠引用计数,也不直接清除“无用对象”,而是清理“不可达对象”。
标记阶段:从 GC Roots 出发找存活对象
JVM 从一组称为 GC Roots 的对象开始,沿着引用链向下搜索。所有能被这条链触及的对象都被视为“存活”,其余对象即为待回收目标。
常见的 GC Roots 包括:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 虚拟机栈(栈帧中的局部变量表)中引用的对象
- 本地方法栈中 JNI(Native 方法)引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量池引用的对象(如字符串常量)
- 正在被同步锁(synchronized)持有的对象(部分 JVM 实现)
清除阶段:按算法策略回收不可达对象
标记完成后,不同垃圾收集器采用不同方式清理内存:
- 标记-清除(Mark-Sweep):标记后直接清理未标记对象,但会产生内存碎片
- 标记-整理(Mark-Compact):标记后将存活对象向一端移动,再清理边界外空间,避免碎片
- 标记-复制(Mark-Copy):将内存分为两块,标记后把存活对象复制到另一块,然后清空原区域(如年轻代的 Eden/Survivor 区)
注意:对象不是“被标记为无用”,而是“未被标记为存活”
JVM 不主动判断“这个对象没用了”,而是默认所有对象都可回收,只保留那些能从 GC Roots 到达的。即使对象重写了 finalize()(已弃用),也仅在第一次标记后进入 F-Queue 队列,且不保证执行,更不改变其不可达本质。
现代 GC(如 G1、ZGC)还会结合分代、区域化、并发标记等技术优化效率,但核心逻辑仍是“以根可达为准,未达即收”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










