1、强引用(Strong Reference)
强引用是默认的引用类型,在 Java 中创建对象时,如果没有显式地指定引用类型,就会使用强引用。强引用可以让对象不被垃圾回收器回收,直到引用对象变为 null 或者程序结束。
下面是一个使用软引用的简单例子:
public class StrongReferenceExample {
public static void main(String[] args) {
Object obj = new Object(); // 强引用,只有当JVM通过垃圾回收算法判定该对象为垃圾时才会回收,否则宁可抛出OOM错误也不会回收该对象
if (obj == null) {
System.out.println("对象已被回收");
} else {
System.out.println("对象在内存中");
}
}
}
2、软引用(Soft Reference)
软引用是一种比强引用弱一些的引用类型。当系统内存不足时,垃圾回收器可能会回收只被软引用引用的对象。使用软引用可以避免因为内存占用过高而导致的 OutOfMemoryError 异常。
下面是一个使用软引用的简单例子:
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
Object referent = new Object();
SoftReference<Object> softRef = new SoftReference<Object>(referent);
referent = null; // 断开强引用,referent 对象只被软引用 softRef 引用
// 此时 referent 对象可能被回收,也可能不会被回收
Object obj = softRef.get(); // 通过软引用获取 referent 对象
if (obj == null) {
System.out.println("对象已被回收");
} else {
System.out.println("对象在内存中");
}
}
}
3、弱引用(Weak Reference)
弱引用是一种比软引用更弱的引用类型。当系统内存不足时,垃圾回收器会立即回收只被弱引用引用的对象。使用弱引用可以避免因为对象被无用引用占用而导致的内存泄漏问题。
下面是一个使用弱引用的简单例子:
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
Object referent = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(referent);
referent = null; // 断开强引用,referent 对象只被弱引用 weakRef 引用
// 此时 referent 对象可能被回收,也可能不会被回收
Object obj = weakRef.get(); // 通过弱引用获取 referent 对象
if (obj == null) {
System.out.println("对象已被回收");
} else {
System.out.println("对象在内存中");
}
}
}
4、虚引用(Phantom Reference)
虚引用是一种最弱的引用类型。虚引用主要用于管理堆外内存,当对象被回收时,虚引用会收到通知,可以在对象被回收前进行一些清理操作。虚引用并不能通过 get() 方法获取引用对象,只能通过其引用队列来管理虚引用对象。
下面是一个使用虚引用的简单例子:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceExample {
public static void main(String[] args) {
Object referent = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
PhantomReference<Object> phantomRef = new PhantomReference<Object>(referent, queue);
referent = null; // 断开强引用,referent 对象只被虚引用 phantomRef 引用
// 此时 referent 对象可能被回收,也可能不会被回收
Object obj = phantomRef.get(); // 通过虚引用获取 referent 对象
if (obj == null) {
System.out.println("对象已被回收");
} else {
System.out.println("对象在内存中");
}
// 检查队列中是否有虚引用
PhantomReference<Object> ref = null;
while ((ref = (PhantomReference<Object>) queue.poll()) != null) {
System.out.println("对象准备被清理");
// 执行对象终结操作...
}
}
}
Java 中引用类型的选择取决于对象的生命周期和内存占用情况。强引用适用于对象的生命周期长且内存占用较小的情况,而软引用和弱引用适用于对象的生命周期不确定且内存占用较大的情况。虚引用适用于需要在对象被回收前进行一些清理操作的情况。
版权声明:本文为weixin_42754779原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。