在 Java 中,判断对象是否可以被回收是通过垃圾回收器(Garbage Collector)来完成的。Java 的垃圾回收器使用了一种称为"可达性分析"(Reachability Analysis)的算法来确定对象是否可达。
可达性分析算法基于以下原理:当一个对象不再被任何活动的引用所引用时,即没有任何方式可以访问到该对象时,该对象就被认为是不可达的,可以被回收。
Java 中的引用分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。
- 强引用:使用最常见的引用类型,如果一个对象具有强引用,即使系统内存不足时,垃圾回收器也不会回收该对象。只有当强引用被显式地置为 null 时,才可能被回收。
- 软引用:软引用用于描述还有用但非必需的对象。当系统内存不足时,垃圾回收器可能会回收软引用对象。可以通过
SoftReference
类来创建软引用。 - 弱引用:弱引用用于描述非必需的对象,当垃圾回收器运行时,只要发现弱引用对象,不管内存是否充足,都会将其回收。可以通过
WeakReference
类来创建弱引用。 - 虚引用:虚引用主要用于跟踪对象被垃圾回收的状态,无法通过虚引用访问对象,也无法通过虚引用取得对象的引用。可以通过
PhantomReference
类来创建虚引用。
Java 垃圾回收器通过遍历对象的引用关系图,从 GC Roots(一组根对象,如虚拟机栈、本地方法栈、静态变量等)出发,标记所有可达的对象,未被标记的对象就被认为是不可达的,可以被回收。
需要注意的是,垃圾回收器的工作是自动进行的,程序员无法直接控制对象的回收时机。但可以通过System.gc()
方法来建议垃圾回收器进行垃圾回收操作。