垃圾回收是JVM自动管理内存的核心机制,通过识别并清除堆中不再被引用的对象来释放内存。Java采用可达性分析算法判断对象是否可回收,以GC Roots为起点,未被引用链关联的对象被视为垃圾。常见的回收器包括Serial、Parallel、CMS(已弃用)、G1、ZGC和Shenandoah,适用于不同场景。堆内存分为年轻代和老年代,新对象先分配在Eden区,经历多次Minor GC后存活的对象晋升至老年代,老年代触发的Full GC较慢,应尽量减少其频率。合理编码与JVM调优可提升性能。

Java中的垃圾回收(Garbage Collection, GC)机制是JVM自动管理内存的核心功能。它的主要作用是识别并清理程序中不再使用的对象,释放内存空间,避免内存泄漏和手动管理内存带来的错误。
什么是垃圾回收
在Java中,所有对象都创建在堆(Heap)上。当一个对象不再被任何引用变量指向时,它就成为“不可达”对象,也就是所谓的“垃圾”。垃圾回收器会定期扫描堆内存,找出这些无用对象并回收其占用的空间。
开发者不需要显式调用类似delete的操作,JVM会在适当的时候自动触发GC。
如何判断对象是否可回收
JVM通过一些算法来判断对象是否可以被回收,常用的方法包括:
立即学习“Java免费学习笔记(深入)”;
- 引用计数法:每个对象维护一个引用计数,当有引用指向它时计数加1,引用失效则减1。计数为0时即可回收。Java一般不使用这种方法,因为它无法处理循环引用问题。
- 可达性分析算法:从一组称为“GC Roots”的对象开始,向下搜索引用链。不在任何引用链上的对象被视为可回收。GC Roots通常包括:正在执行的方法中的局部变量、活跃线程、类的静态变量等。
常见的垃圾回收器类型
Java提供了多种垃圾回收器,适用于不同的应用场景:
- Serial GC:单线程回收,适合客户端小应用。
- Parallel GC:多线程进行垃圾回收,关注吞吐量。
- CMS GC:以最短停顿时间为目标,并发标记清除,但已从Java 14起被弃用。
- G1 GC:面向大堆内存,将堆划分为多个区域,优先回收垃圾最多的区域,兼顾吞吐量和停顿时间。
- ZGC / Shenandoah:低延迟GC,支持极短的暂停时间,适合对响应时间敏感的应用。
对象的生命周期与分代回收
Java堆通常分为年轻代(Young Generation)和老年代(Old Generation),这是基于“大多数对象朝生夕死”的经验假设。
- 新创建的对象首先分配在年轻代的Eden区。
- 经过一次Minor GC后仍存活的对象会被移到Survivor区,并记录年龄。
- 当对象年龄达到一定阈值(默认15),就会晋升到老年代。
- 老年代触发的是Major GC或Full GC,速度较慢,应尽量避免频繁发生。
理解垃圾回收机制有助于写出更高效的代码,比如及时断开不必要的引用、避免创建大量短期对象、合理设置JVM参数等。基本上就这些,不复杂但容易忽略细节。










