java对象生命周期由引用类型决定:强引用禁止回收,软引用在oom前回收用于缓存,弱引用在每次gc时回收防泄漏,虚引用不阻止回收但可配合队列感知回收时机用于资源清理。

Java 中对象的生命周期不是由“new 之后多久销毁”决定的,而是由它是否还能从 GC Roots 被访问到——而这个“能否访问”,直接受引用类型控制。强、软、弱、虚四类引用构成一个强度递减、回收时机逐级提前的体系,每一种都对应明确的内存管理意图。
强引用:默认“不放手”,靠作用域或显式断开释放
Object obj = new Object() 就是强引用。只要栈帧里还存着这个变量,或者堆中其他对象仍通过字段持有它,JVM 就认定该对象必须存活。哪怕内存即将耗尽,也宁可抛 OutOfMemoryError,绝不会回收。
- 释放时机取决于引用是否真正消失:方法结束时局部变量自动失效;静态字段需手动置 null 或业务逻辑清理
- 容易引发泄漏:比如 static Map 缓存了大量业务对象,却忘了移除,这些对象就一直被强引用锁住
- 不需要额外包装类,也不用 get() 方法取值,直接使用即可
软引用:内存吃紧时的“缓存守门人”
SoftReference
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合做图片、HTML 片段、查询结果等体积大、重建成本高、但非强一致性的缓存
- 每次使用前必须判空:ref.get() 可能返回 null,不能假设它一定还在
- 可关联 ReferenceQueue,在对象被回收后收到通知,及时清理索引、关闭流等配套资源
弱引用:GC 一扫即收,专治映射类泄漏
WeakReference
- 典型用途是 WeakHashMap:key 是弱引用,一旦 key 对象无其他强引用,整条 Entry 自动失效,避免 map 长期持 key 导致泄漏
- ThreadLocal 内部也用弱引用作 key,防止线程长期运行导致 value 无法释放
- 不适合常规缓存:命中率低,频繁重建反而加重 GC 压力
虚引用:不保命,只报信,专用于资源善后
PhantomReference
- 必须搭配 ReferenceQueue 使用,单独创建毫无意义
- 典型场景是堆外内存清理:比如 NIO 的 DirectByteBuffer,靠 Cleaner(基于虚引用)在回收时触发 unsafe.freeMemory()
- 也可用于监听对象销毁,执行日志、统计或关闭依赖资源等收尾动作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










