java四种引用类型按强度递减为强、软、弱、虚引用:强引用阻止gc回收,内存不足时抛oom;软引用在oom前被回收,适用于内存敏感缓存;弱引用在每次gc时回收,用于weakhashmap等避免泄漏;虚引用不阻止回收,仅通过referencequeue通知对象回收,用于资源清理。

Java 四种引用类型直接决定了对象在垃圾回收时的“存活优先级”。它们不是语法糖,而是 JVM 垃圾回收器执行可达性分析后,对不同引用强度对象采取不同处置策略的依据。
强引用:GC 绝不妥协
只要对象被至少一个强引用指向,无论内存多么紧张,JVM 宁愿抛 OutOfMemoryError 也不会回收它。这是默认行为,也是绝大多数变量的引用方式。
- 方法内局部变量超出作用域后,强引用自动消失,对象进入可回收状态
- 类成员变量或静态变量持有的强引用需显式置为 null,否则可能长期驻留堆中
- ArrayList 的 clear() 方法逐个设元素为 null,正是为断开强引用链,避免内存滞留
软引用:OOM 前的最后一道防线
软引用对象在内存充足时全程保留;仅当 GC 后仍无法满足内存需求时,才会被批量回收。它的回收时机由 JVM 内存压力触发,而非固定轮次。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 适合做缓存——比如图片、JSON 解析结果等“有用但非必需”的数据
- 调用 get() 返回 null 时,说明已被回收,需重新加载
- 注意:软引用不保证“一定缓存住”,不能用于必须存在的业务状态
弱引用:GC 来了就走
只要发生任意一次 GC(包括 Young GC),仅被弱引用持有的对象就会被立即回收。它不参与内存压力判断,只表达“我允许你随时收走”。
- 典型应用是 WeakHashMap:key 用弱引用,防止 key 已不可达却因 map 持有而无法释放
- ThreadLocal 的 key 也用弱引用,配合 get/set 中的清理逻辑,避免线程复用导致 value 泄漏
- 监听器注册场景中,用 WeakReference 存 listener,可规避忘记反注册引发的泄漏
虚引用:不挡回收,只发通知
虚引用无法通过 get() 获取对象(永远返回 null),也不影响对象生命周期。唯一作用是:当对象被回收时,JVM 会将该虚引用加入关联的 ReferenceQueue,供程序感知并执行清理动作。
- 常用于资源跟踪,比如关闭文件句柄、释放 native 内存等需要与 GC 协同的场景
- 必须配合 ReferenceQueue 使用,单独创建虚引用无实际意义
- 它是四种引用中唯一不用于“保对象”,而专用于“收尾通知”的类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










