在 Java 中,**弱引用(WeakReference)**是一种比软引用更“弱”的引用类型,它的特点是:
只要 GC 发生,无论内存是否充足,被弱引用关联的对象都会被回收。
import java.lang.ref.WeakReference;
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
// 此时对象只被弱引用关联
Object o = weakRef.get();
if (o != null) {
// 对象还没被回收
} else {
// 对象已被 GC 回收
}
弱引用常用于不阻止对象回收的缓存。
Map<Key, WeakReference<Value>> cache = new HashMap<>();
但更推荐直接用 JDK 提供的:
WeakHashMap<Key, Value> map = new WeakHashMap<>();
WeakHashMap的 key 是弱引用,key 被 GC 后,对应 entry 会自动移除。
比如在 Android 或 GUI 中:
class Listener {
WeakReference<Activity> activityRef;
Listener(Activity activity) {
activityRef = new WeakReference<>(activity);
}
void onEvent() {
Activity activity = activityRef.get();
if (activity != null) {
activity.update();
}
}
}
ThreadLocalMap 中的 key 就是弱引用,防止线程不结束时导致内存泄漏。
当弱引用对象被回收时,可以收到通知:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);
// GC 后
Reference<?> polled = queue.poll();
if (polled != null) {
// 对象已被回收
}
常用于:
| 引用类型 | GC 行为 | 用途 |
|---|---|---|
| 强引用 | 不回收 | 普通对象 |
| 软引用 | 内存不足时回收 | 内存敏感缓存 |
| 弱引用 | 下次 GC 必回收 | 防内存泄漏 |
| 虚引用 | 随时可能回收 | 跟踪回收状态 |
get() 判断如果你有具体使用场景(比如缓存 / Android / ThreadLocal / JVM 原理),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。