在 Java 中,**弱引用(WeakReference)**是 java.lang.ref 包下提供的一种引用类型,用来描述“非必需”对象。被弱引用关联的对象,在 下一次垃圾回收(GC)时,无论内存是否足够,都会被回收。
下面从概念 → API → 使用示例 → 常见场景逐步说明。
Java 提供 4 种引用强度(由强到弱):
Object o = new Object();import java.lang.ref.WeakReference;
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
Object ref = weakRef.get();
if (ref != null) {
// 对象还存在
}
public class WeakReferenceDemo {
public static void main(String[] args) {
WeakReference<Object> weakRef =
new WeakReference<>(new Object());
System.gc(); // 建议 GC
System.out.println(weakRef.get()); // 很可能输出 null
}
}
注意:
System.gc()只是“建议”,不保证立即执行。
当弱引用对象被回收时,可以把引用本身放入队列,用于清理资源。
import java.lang.ref.*;
public class WeakRefQueueDemo {
public static void main(String[] args) throws InterruptedException {
ReferenceQueue<Object> queue = new ReferenceQueue<>();
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj, queue);
obj = null;
System.gc();
Thread.sleep(100);
Reference<?> ref = queue.poll();
if (ref != null) {
System.out.println("对象已被回收,弱引用进入队列");
}
}
}
Map<Key, WeakReference<Value>> cache = new HashMap<>();
当 Value 对象只被缓存引用时,GC 可自动回收。
更推荐直接用:
WeakHashMap<K, V>
WeakReference<Listener> listenerRef = new WeakReference<>(listener);
避免 Listener 长期持有 Activity / Context。
ThreadLocalMap 的 key 就是 WeakReference<ThreadLocal<?>>,防止线程不结束时内存泄漏。
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
WeakHashMap<Object, String> map = new WeakHashMap<>();
Object key = new Object();
map.put(key, "value");
key = null;
System.gc();
System.out.println(map.size()); // 可能为 0
}
}
get() 可能返回 null如果你愿意,我可以:
你更想深入哪一部分?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。