java如何识别垃圾
Java 垃圾识别机制
Java 通过垃圾回收(Garbage Collection, GC)自动管理内存,识别垃圾对象主要依赖以下机制:
可达性分析算法
Java 虚拟机会从一组称为 GC Roots 的对象出发,递归遍历对象引用链。如果一个对象无法通过任何引用链与 GC Roots 关联,则判定为垃圾。常见的 GC Roots 包括:
- 虚拟机栈中引用的对象(局部变量、方法参数等)。
- 方法区中静态属性引用的对象(静态变量)。
- 方法区中常量引用的对象(如字符串常量池)。
- JNI(本地方法)引用的对象。
引用类型分类
Java 将引用分为四类,帮助更灵活地识别垃圾:
- 强引用(Strong Reference):默认引用类型,只要存在强引用,对象不会被回收。
- 软引用(Soft Reference):内存不足时会被回收,适合缓存场景。
- 弱引用(Weak Reference):下次垃圾回收时立即被回收,如
WeakHashMap的键。 - 虚引用(Phantom Reference):无法通过虚引用获取对象,仅用于跟踪回收状态。
垃圾回收触发条件
- 新生代(Young Generation):当 Eden 区空间不足时触发 Minor GC。
- 老年代(Old Generation):空间不足时触发 Major GC 或 Full GC。
- System.gc() 调用:建议 JVM 执行垃圾回收,但不保证立即执行。
垃圾回收器实现
不同垃圾回收器采用不同算法识别和清理垃圾:
- Serial GC:单线程标记-复制(新生代)和标记-整理(老年代)。
- Parallel GC:多线程并行回收,注重吞吐量。
- CMS(Concurrent Mark-Sweep):并发标记清除,减少停顿时间。
- G1(Garbage-First):分区回收,兼顾低延迟和高吞吐。
- ZGC/Shenandoah:超低延迟,适用于大堆内存。
代码示例:弱引用与垃圾回收
import java.lang.ref.WeakReference;
public class GarbageCollectionDemo {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 取消强引用
System.gc(); // 触发垃圾回收
System.out.println(weakRef.get()); // 可能输出 null
}
}
说明:当强引用 obj 被置为 null 后,弱引用 weakRef 指向的对象会在垃圾回收时被清除。
监控垃圾回收
通过 JVM 参数和工具观察垃圾回收行为:

- 命令行参数:
-XX:+PrintGCDetails打印 GC 日志。 - 工具:VisualVM、JConsole、GCEasy 分析 GC 日志。
通过上述机制,Java 能够高效识别并回收垃圾对象,避免内存泄漏。






