java中四种引用类型按强度递减为强、软、弱、虚引用:强引用使对象永不被gc回收;软引用在内存不足时才回收,适用于缓存;弱引用在每次gc时立即回收,用于避免内存泄漏;虚引用无法获取对象,仅用于接收回收通知。

Java中四种引用类型决定了对象在JVM垃圾回收时的“存活优先级”,本质是GC根据引用强度决定是否回收该对象。它们不是语法关键字,而是java.lang.ref包下的类,行为差异体现在GC可达性分析后的处置逻辑上。
强引用:GC绝不回收,OOM也不妥协
只要对象被至少一个强引用指向(如 Object obj = new Object()),JVM就认定该对象“必须存活”。即使堆内存耗尽,GC也不会回收它,而是直接抛出 OutOfMemoryError。只有当强引用显式置为 null 或超出作用域(如方法结束),对象才可能进入可回收状态。
软引用:内存不足时才回收,适合缓存
软引用对象在GC时不立即回收,仅当JVM判断内存即将溢出(即多次GC后仍无法满足分配需求)时,才会批量清理所有软引用指向的对象。这种“延迟回收”机制使其天然适用于内存敏感型缓存——比如图片加载库中暂存解码后的Bitmap。注意:软引用回收时机由JVM自主决策,并非每次GC都触发。
弱引用:GC一到就回收,生命周期最短
只要发生任意一次垃圾回收(无论Young GC还是Full GC),所有仅被弱引用持有的对象都会被立即回收。WeakReference常用于避免内存泄漏的场景,例如ThreadLocal中的key、WeakHashMap的键值映射。使用时需始终检查 ref.get() != null,否则容易触发NullPointerException。
虚引用:无法访问对象,仅用于回收通知
虚引用无法通过 get() 获取原始对象(始终返回 null),它的唯一作用是配合 ReferenceQueue 接收对象被回收的信号。当GC准备回收一个仅剩虚引用的对象时,会先将该虚引用入队,程序可通过轮询队列得知“对象已终结”。这替代了已被弃用的 finalize() 方法,实现更可控的资源清理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











