每日一道面试题 13:Java 中的强引用、软引用、弱引用、虚引用分别是什么?有什么用?

张开发
2026/5/26 14:34:52 15 分钟阅读
每日一道面试题 13:Java 中的强引用、软引用、弱引用、虚引用分别是什么?有什么用?
一、先说结论Java 设计 4 种引用级别核心目的是让 JVM 更灵活地决定对象回收时机让开发者能和 GC 协作避免 OOM、优化内存。级别从强到弱依次强引用 软引用 弱引用 虚引用二、强引用Strong Reference1.是什么平时写的new Object()都是强引用Object obj new Object();2.特点只要强引用还在GC永远不会回收即使内存快 OOM 了也不回收直接抛 OutOfMemoryError我们 99% 的代码都用它3.面试一句话强引用是默认引用GC 不会回收存活的强引用对象内存不足直接 OOM。三、软引用SoftReference1.是什么SoftReferenceObject soft new SoftReference(new Object());2.特点内存不够才回收内存充足时和强引用一样留着只有即将 OOM 前GC 才会回收软引用指向的对象3.使用场景缓存图片缓存、网页缓存内存够就用缓存内存不够就回收缓存保证不 OOM4.面试一句话软引用用于缓存内存充足保留内存不足时 GC 会回收避免 OOM。四、弱引用WeakReference1.是什么WeakReferenceObject weak new WeakReference(new Object());2.特点只要 GC 扫描到就回收不管内存够不够下次 GC 必收生命周期很短3.使用场景ThreadLocal 核心实现、临时缓存、容器辅助数据最典型ThreadLocalMap的 key 就是弱引用。4.面试一句话弱引用生命周期极短GC 一旦发现就回收常用于 ThreadLocal、防止内存泄漏。五、虚引用PhantomReference1.是什么必须配合引用队列使用ReferenceQueueObject queue new ReferenceQueue(); PhantomReferenceObject phantom new PhantomReference(new Object(), queue);2.特点等于没有引用无法通过它获取对象实例唯一作用对象被回收时收到一个系统通知3.使用场景堆外内存释放Netty 中大量使用精准监控对象回收时机4.面试一句话虚引用不决定对象生命周期仅用于接收对象回收通知多用于堆外内存管理。六、一张表彻底记住面试必背引用类型GC 回收时机典型使用场景强引用永不主动回收日常业务对象软引用内存不足时回收内存敏感型缓存弱引用每次 GC 都回收ThreadLocal、临时缓存虚引用等同无引用仅做通知堆外内存释放、对象回收监控七、高频追问必看1.ThreadLocal 为什么用弱引用答避免 ThreadLocal 实例不再使用后因为 key 强引用而无法被 GC从而减少内存泄漏风险。2.软引用和弱引用缓存怎么选追求命中率、允许占内存 → 软引用追求低内存占用、快速释放 → 弱引用3.虚引用能拿到对象吗不能get()永远返回 null只能通过队列监听回收。八、总结强引用最常用、GC 不回收软引用内存不足才回收适合缓存弱引用 GC 必收用于 ThreadLocal虚引用仅做回收通知用于堆外内存管理。引用级别越强对象越不容易被回收。

更多文章