在 Java 中,软引用(SoftReference) 是 java.lang.ref.SoftReference 提供的引用类型,主要用于内存敏感的高速缓存场景。
软引用:当内存充足时,GC 不会回收软引用对象;当内存不足时,GC 会回收软引用对象。
它是介于 强引用 和 弱引用 之间的引用级别。
引用强度排序:
强引用 > 软引用 > 弱引用 > 虚引用
import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
public static void main(String[] args) {
// 强引用对象
byte[] data = new byte[1024 * 1024 * 10]; // 10MB
// 创建软引用
SoftReference<byte[]> softRef = new SoftReference<>(data);
// 解除强引用
data = null;
// 通过软引用获取对象
byte[] result = softRef.get();
if (result != null) {
System.out.println("对象还存在");
} else {
System.out.println("对象已被回收");
}
}
}
import java.lang.ref.SoftReference;
import java.util.HashMap;
public class CacheDemo {
private static HashMap<String, SoftReference<Object>> cache = new HashMap<>();
public static void put(String key, Object value) {
cache.put(key, new SoftReference<>(value));
}
public static Object get(String key) {
SoftReference<Object> ref = cache.get(key);
return ref == null ? null : ref.get();
}
}
当 JVM 内存紧张时,缓存对象会被自动回收,避免 OOM。
如果你想在对象被回收时做清理:
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
public class SoftWithQueue {
public static void main(String[] args) {
ReferenceQueue<byte[]> queue = new ReferenceQueue<>();
SoftReference<byte[]> ref =
new SoftReference<>(new byte[1024 * 1024 * 5], queue);
// GC 后可以通过 queue.poll() 清理缓存
}
}
| 引用类型 | 是否会被 GC | 使用场景 |
|---|---|---|
| 强引用 | 不会 | 普通对象 |
| 软引用 | 内存不足时 | 缓存 |
| 弱引用 | 下次 GC | 防止内存泄漏 |
LruCache✅ 软引用适合:
❌ 不适合:
如果你愿意,我也可以给你讲 Android 中的软引用实践 或 SoftReference + LRU 的实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。