1. JVM垃圾回收机制概述
刚入行Java开发时,我对GC的理解仅限于"自动管理内存"这个模糊概念。直到有次线上服务频繁Full GC导致卡顿,才真正意识到掌握GC机制的重要性。JVM的垃圾回收机制远不止是"自动回收内存"那么简单,它涉及到内存管理、性能调优、系统稳定性等核心问题。
在HotSpot虚拟机中,垃圾回收器需要解决三个基本问题:
- 哪些内存需要回收(对象存活判定)
- 什么时候回收(GC触发条件)
- 如何回收(回收算法与实现)
理解GC机制不仅能帮你在面试中脱颖而出,更重要的是能让你在实际开发中写出更高效的代码,遇到内存问题时也能快速定位原因。下面我会结合自己处理过的真实案例,详细解析GC的运作原理和实战要点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 对象存活判定机制
2.1 引用计数法的问题
早期我误以为JVM用的是引用计数法(给对象添加引用计数器),直到遇到循环引用问题才明白其局限性。比如:
java复制class Node {
Node next;
}
Node a = new Node();
Node b = new Node();
a.next = b;
b.next = a; // 循环引用
a = b = null; // 理论上这两个对象应该被回收
引用计数法无法处理这种循环引用的情况,这也是HotSpot虚拟机不采用它的主要原因。
2.2 可达性分析算法
JVM实际使用的是可达性分析(Reachability Analysis),这也是面试常考的重点。其核心思想是:
- 从GC Roots对象(一组必须活跃的引用)作为起点
- 向下搜索引用链,能被遍历到的对象就是存活对象
- 不可达的对象判定为可回收
常见的GC Roots包括:
- 虚拟机栈中引用的对象(局部变量表)
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
- Java虚拟机内部引用(如基本类型对应的Class对象)
关键点:即使在进行可达性分析时不可达的对象,也并非"非死不可",它们会暂时处于"缓刑"阶段,要真正宣告死亡至少要经历两次标记过程。
3. 垃圾回收算法实现
3.1 标记-清除算法(Mark-Sweep)
最基础的算法,分为两个阶段
