java 中的弱引用(weakreference)是一种在垃圾回收时会被立即回收的引用类型,它不阻止对象被 gc 判定为垃圾。要使用它,需要实例化 java.lang.ref.weakreference 并传入目标对象,之后通过调用 get() 方法获取实际对象;如果对象已被回收,该方法将返回 null。

弱引用与强引用的区别是什么
强引用是 Java 中最常见的引用形式,只要存在强引用,对象就永远不会被回收;而弱引用则不同,一旦对象只存在弱引用,GC 就会在下一次扫描时将其回收。这种机制常用于实现缓存或避免内存泄漏,例如在 HashMap 中存储非关键数据时,可以使用弱引用让系统在内存不足时自动清理这些条目。

import java.lang.ref.WeakReference;
public class WeakRefDemo {
public static void main(String[] args) {
// 创建强引用对象
String strongRef = new String("Hello");
// 创建弱引用指向同一对象
WeakReference<string> weakRef = new WeakReference(strongRef);
System.out.println("Before GC: " + weakRef.get());
// 解除强引用
strongRef = null;
// 建议 GC (不一定立即执行)
System.gc();
try {
Thread.sleep(100); // 等待 GC 完成
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After GC: " + weakRef.get());
}
}</string>
软引用和虚引用有什么区别
软引用(SoftReference)在内存充足时不会被回收,只有在内存不足时才会被回收,适合做内存敏感的高速缓存;而虚引用(PhantomReference)则最为特殊,它必须配合引用队列(ReferenceQueue)使用,且 get() 方法始终返回 null,主要用于追踪对象被回收的状态,常用于资源释放后的清理工作。

import java.lang.ref.SoftReference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class RefComparison {
public static void main(String[] args) {
Object obj = new Object();
// 软引用示例
SoftReference<object> softRef = new SoftReference(obj);
System.out.println("Soft: " + softRef.get());
// 虚引用示例
ReferenceQueue<object> queue = new ReferenceQueue();
PhantomReference<object> phantomRef = new PhantomReference(obj, queue);
System.out.println("Phantom: " + phantomRef.get()); // 始终为 null
obj = null;
System.gc();
try { Thread.sleep(100); } catch (Exception e) {}
System.out.println("Soft after GC: " + softRef.get());
System.out.println("Phantom after GC: " + phantomRef.get());
}
}</object></object></object>
弱引用在哪些场景下最适用
弱引用最适合用于那些“有备无患”但非核心的数据结构,比如浏览器历史记录、类加载器缓存等。在这些场景中,对象的存在与否不应影响程序运行,但当内存紧张时,系统应能自动释放这些对象所占用的空间,从而避免 OutOfMemoryError。此外,在实现 WeakHashMap 时,键值对之间的关联就是通过弱引用实现的,当键不再被其他强引用持有时,对应的值也会被自动移除。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











