java对象生命周期由引用类型决定:强引用永不回收;软引用在内存不足时回收,用于缓存;弱引用在下次gc时回收,防泄漏;虚引用无法获取对象,仅用于回收通知,需配合引用队列。

Java 中的对象生命周期,从创建到销毁,始终围绕“引用”展开。理解不同引用类型,就是掌握 JVM 如何决定一个对象该不该被回收的关键。
强引用:最常见也最难被回收
日常写的 new Object() 或赋值语句(如 Object obj = new Object();)产生的就是强引用。只要强引用链存在,GC 永远不会回收它,哪怕内存不足抛出 OutOfMemoryError 也不会动它。
释放强引用的常见方式:
- 将引用变量设为 null
- 让引用超出作用域(如方法结束、局部变量自然失效)
- 显式切断引用链(比如清空集合、置空字段)
软引用:内存紧张时才回收的“缓存型”引用
用 SoftReference
典型用途是实现内存敏感的缓存:
- 图片缓存、解析结果缓存等可重建但耗时的数据
- 需配合 get() 方法判空使用,因为可能已为 null
- 不保证立即回收——JVM 可能保留多个软引用对象,直到真正缺内存
弱引用:只存活到下次 GC 的“临时关联”
WeakReference
常用场景包括:
- 避免内存泄漏的监听器或回调注册(如 WeakHashMap 的 key)
- 临时绑定上下文,但不阻止被引用对象被回收
- 必须每次调用 get() 并检查是否为 null,不能假设它还有效
虚引用:唯一不能获取对象实例的引用类型
PhantomReference
实际使用需配合引用队列(ReferenceQueue):
- 当对象进入 finalize 阶段并准备清除时,虚引用会被加入队列
- 常用于资源清理钩子,比如堆外内存释放、文件句柄关闭等需精确控制时机的操作
- 注意:finalize() 已被弃用,虚引用是替代方案中更可控的选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











