WeakReference(弱引用)是 Java 中 java.lang.ref 包提供的一种引用类型,主要作用是在不阻止对象被垃圾回收的前提下,仍然可以“引用”该对象。
让对象在无其他强引用时,能够被 GC 正常回收,从而避免内存泄漏。
普通强引用(Strong Reference):
Object obj = new Object();
只要 obj 还“可达”,对象就永远不会被回收。
弱引用:
WeakReference<Object> weakRef = new WeakReference<>(new Object());
只要没有强引用指向该对象,下一次 GC 时对象就可以被回收。
缓存不能阻止对象被回收,否则容易造成内存泄漏。
Map<Key, WeakReference<Value>> cache = new HashMap<>();
更常见的是使用:
WeakHashMap(key 是弱引用)SoftReference(用于内存敏感的缓存)当对象只被监听器引用时,弱引用可避免其无法释放。
WeakReference<Listener> listenerRef = new WeakReference<>(listener);
例如:
weakRef.get() 返回 nullReferenceQueue 配合使用,感知对象已被回收ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> ref = new WeakReference<>(new Object(), queue);
| 引用类型 | GC 行为 | 常见用途 |
|---|---|---|
| StrongReference | 不回收 | 普通对象 |
| SoftReference | 内存不足时回收 | 缓存 |
| WeakReference | 下次 GC 就回收 | 缓存 / 防泄漏 |
| PhantomReference | 仅用于回收通知 | 资源清理 |
Object obj = new Object();
WeakReference<Object> wr = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.gc();
System.out.println(wr.get()); // 可能输出 null
WeakReference 的作用是:在“需要用到对象,但又不想阻止它被回收”的场景下,安全地进行引用。
如果你愿意,我可以结合你具体的使用场景(如缓存、Android、框架设计)进一步说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。