一、概述
引用类型 | 说明 | 使用场景 |
---|---|---|
强引用(Strong Reference) | 只要强引用存在,垃圾回收器就不会回收被引用的对象。 | 业务逻辑中的关键对象、长期存在的对象 |
软引用(Soft Reference) | 在系统内存充足的时候,软引用对象不会被回收;当系统内存不足时,软引用对象可能会被垃圾回收器回收,以释放内存空间。 | 缓存、大数据量的临时对象 |
弱引用(Weak Reference) | 弱引用对象的生命周期更短,只要垃圾回收器发现弱引用对象,不管系统内存是否充足,都会回收该对象。 | 容器中的临时对象、避免循环引用导致的内存泄漏 |
虚引用(Phantom Reference) | 虚引用不会决定对象的生命周期,它的存在主要是为了在对象被回收时收到一个通知。 | 资源清理、监测对象回收 |
二、示例
强引用:
public class StrongReferenceExample {
public static void main(String[] args) {
// 创建一个对象并使用强引用
String str = new String("Strong Reference");
System.out.println(str);
}
}
软引用:
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
// 创建一个大对象模拟占用大量内存
byte[] bigData = new byte[1024 * 1024 * 10];
// 使用软引用包裹大对象
SoftReference<byte[]> softRef = new SoftReference<>(bigData);
// 尝试强制进行垃圾回收,看软引用对象是否被回收
System.gc();
if (softRef.get()!= null) {
System.out.println("Soft reference object is still available.");
} else {
System.out.println("Soft reference object has been collected.");
}
}
}
弱引用:
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
// 创建一个对象
String str = new String("Weak Reference");
// 使用弱引用包裹对象
WeakReference<String> weakRef = new WeakReference<>(str);
// 尝试强制进行垃圾回收
System.gc();
if (weakRef.get()!= null) {
System.out.println("Weak reference object is still available.");
} else {
System.out.println("Weak reference object has been collected.");
}
}
}
虚引用:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceExample {
public static void main(String[] args) {
// 创建一个对象
String str = new String("Phantom Reference");
// 创建引用队列
ReferenceQueue<String> queue = new ReferenceQueue<>();
// 使用虚引用包裹对象并关联引用队列
PhantomReference<String> phantomRef = new PhantomReference<>(str, queue);
// 尝试强制进行垃圾回收
System.gc();
// 检查引用队列中是否有虚引用对象被回收
try {
if (queue.poll()!= null) {
System.out.println("Phantom reference object has been collected.");
} else {
System.out.println("Phantom reference object is still in memory.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、项目实践
实践应用一:
如在图片加载库中,将已经加载过的图片用软引用来存储,当系统内存充足时可快速访问,内存不足时自动回收以避免系统崩溃。
实践应用二:
处理大型文件时,将文件部分内容读取到内存中进行处理,处理完后可回收以释放内存。
实践应用三:
在一些容器类中存储临时对象,当对象不再被外部强引用持有时能自动被回收。例如在事件监听器管理容器中,当组件不再被使用时,其对应的事件监听器对象若只被容器弱引用,可及时被回收避免内存泄漏。
实践应用四:
在图形绘制系统等场景中,若两个对象之间存在循环引用,且其中一个对象只在特定情况下被访问,可使用弱引用打破循环引用确保对象能被回收。