1. JVM垃圾回收机制概述
在Java开发中,内存管理一直是个绕不开的话题。与C/C++等需要手动管理内存的语言不同,Java通过自动垃圾回收机制(Garbage Collection)来管理内存,这既是Java语言的特色,也是让很多开发者又爱又恨的特性。作为一名长期奋战在一线的Java开发者,我见过太多因为GC问题导致的系统卡顿、吞吐量下降甚至OOM崩溃的案例。
JVM的垃圾回收机制本质上是在做三件事:识别哪些对象已经"死亡"(不再被引用)、回收这些对象占用的内存空间、整理内存碎片。听起来简单,但实际实现却异常复杂,涉及到分代收集、并发标记、STW停顿等一系列精妙设计。理解GC的工作原理,对于调优Java应用性能、解决内存泄漏问题至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GC核心概念与原理
2.1 对象存亡判定
JVM判断对象是否存活的算法主要有两种:
-
引用计数法:每个对象维护一个引用计数器,当被引用时加1,引用失效时减1。计数器为0时表示可回收。这种方法简单但无法解决循环引用问题。
-
可达性分析算法:通过"GC Roots"对象作为起点,向下搜索引用链,不在引用链上的对象即为可回收对象。这是目前主流JVM采用的算法。
java复制// 循环引用示例
class Node {
Node next;
}
public class Main {
public static void main(String[] args) {
Node a = new Node();
Node b = new Node();
a.next = b;
b.next = a; // 循环引用
a = null;
b = null; // 引用计数法无法回收,但可达性分析可以
}
}
2.2 分代收集理论
基于"弱分代假说"(绝大多数对象朝生夕死)和"强分代假说"(熬过越多次GC的对象越难消亡),HotSpot JVM将堆内存划分为:
- 新生代(Young Generation):新创建对象的存放区域,又分为Eden区和两个Survivor区
- 老年代(Old Generation):长
