在Java中,对象的引用类型主要分为四种,它们分别是:
1. **强引用(Strong Reference)**:
- 这是最常见的引用类型,比如 `Object obj = new Object()`; 就是一个强引用。
- 只要强引用还存在,垃圾回收器就不会回收这个对象。
2. **软引用(Soft Reference)**:
- 软引用通过 `java.lang.ref.SoftReference` 类实现。
- 当系统内存不足时,垃圾回收器会回收软引用指向的对象来释放内存,但在此之前会清除这些对象的软引用。
- 软引用通常用于实现内存敏感的缓存。
3. **弱引用(Weak Reference)**:
- 弱引用通过 `java.lang.ref.WeakReference` 类实现。
- 弱引用不会阻止垃圾回收器回收其指向的对象,也就是说,只要垃圾回收器发现了弱引用,就会回收其指向的对象,并且清除弱引用本身。
- 弱引用常用于跟踪对象的生命周期,或者实现一些需要自动清理的数据结构。
4. **虚引用(Phantom Reference)**:
- 虚引用通过 `java.lang.ref.PhantomReference` 类实现。
- 虚引用的主要目的是在对象被回收后收到一个系统通知,或者实现延迟处理(比如延时写入磁盘)。
- 虚引用必须和 `ReferenceQueue` 一起使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会将这个虚引用加入到与之关联的 `ReferenceQueue` 中。
下面是一个简单的示例,展示如何使用软引用、弱引用和虚引用:
import java.lang.ref.*;
public class ReferenceTypesExample {
public static void main(String[] args) {
// 软引用示例
SoftReference<String> softReference = new SoftReference<>(new String("Soft Reference"));
System.out.println("Soft Reference: " + softReference.get());
// 弱引用示例
WeakReference<String> weakReference = new WeakReference<>(new String("Weak Reference"));
System.out.println("Weak Reference: " + weakReference.get());
// 虚引用示例
PhantomReference<String> phantomReference = new PhantomReference<>(new String("Phantom Reference"), new ReferenceQueue<>());
System.out.println("Phantom Reference: " + phantomReference.get());
// 强制进行垃圾回收,观察引用行为
System.gc();
// 尝试再次获取引用,可能会发现它们已经被回收
System.out.println("Soft Reference after GC: " + softReference.get());
System.out.println("Weak Reference after GC: " + weakReference.get());
// 虚引用不会返回对象,总是返回null
System.out.println("Phantom Reference after GC: " + phantomReference.get());
}
}
请注意,`System.gc()` 方法仅仅是一个建议,它请求 JVM 进行垃圾回收,但并不保证立即执行。实际的垃圾回收行为取决于 JVM 的实现和运行时的内存状况。