java四种引用的核心区别在于垃圾回收策略:强引用绝不回收,软引用内存不足时回收,弱引用每次gc都回收,虚引用不阻止回收仅用于回收通知。

Java 中四种引用的核心区别在于垃圾回收器对它们的处理策略不同,直接决定了对象的存活时间与内存行为。区分关键看“GC 会不会收”和“什么时候收”,使用关键看“业务要不要它活久一点”。
强引用:默认存在,绝不让 GC 动它
只要变量还指向对象(比如 Object obj = new Object()),这个对象就永远不会被回收——哪怕内存爆了抛 OutOfMemoryError,JVM 也不会碰它。
- 适合长期持有的核心对象:用户服务实例、配置类、单例Bean
- 风险点:容易引发内存泄漏,比如静态集合一直存着大对象,或 ThreadLocal 没调 remove()
- 释放建议:不用时及时置为 null,或从集合中移除引用(如 ArrayList.clear() 中逐个设 null)
软引用:内存快撑不住了,才考虑放手
用 SoftReference
- 典型用途:内存敏感型缓存,比如图片缩略图、查询结果缓存
- 注意:不能依赖它“一定不被回收”,也不代表能避免 OOM(只是延缓)
- 可搭配 ReferenceQueue 监听回收事件,用于清理关联资源
弱引用:GC 一来,立刻清退
用 WeakReference
- 适用场景:临时性、非关键缓存(如 ClassLoader 缓存)、ThreadLocal 的 key(防止内存泄漏)
- 必须每次使用前判空:ref.get() != null,否则可能返回 null
- 常见误用:当成“轻量级强引用”用,结果运行中突然取不到对象
虚引用:不挡回收,只为“打个报告”
用 PhantomReference
- 唯一作用:在对象被 GC 回收的瞬间收到通知,用于执行清理逻辑
- 典型落地:堆外内存(DirectByteBuffer)释放、文件句柄关闭、自定义资源回收钩子
- 单独使用无意义——没队列就收不到通知,也没法做任何事
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











