← 每日面试题 学习看板

什么是强引用、软引用、弱引用和虚引用?

面试题/00java/03JVM/04垃圾回收(GC)基础/什么是强引用、软引用、弱引用和虚引用?.md

面试记录 2026-09-21

题目:什么是强引用、软引用、弱引用和虚引用?

难度:low

标签:jvm/gc, general/knowledge, difficulty/low

评分:⭐⭐☆☆☆(2/5)

我的回答

强、软、弱、虚几种引用方式,其实常用的只有强引用,就是我们默认的创建对象的引用方式是强引用。另外常见的弱引用的话,是在 ThreadLocal 里边,它会使用弱引用,这时候会在对象垃圾回收的时候,优先去回收这些内容。虚引用这种暂时我没有用到过,但是我记得有它使用的场景,好像是垃圾回收方面的,有这方面使用,但实际上我没有尝试使用过它。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察 Java 内存引用体系的完整性理解,以及各引用类型在真实项目中的落地场景。

知识点拆解:

  1. 强引用(Strong Reference)
  1. 软引用(Soft Reference)
  1. 弱引用(Weak Reference)
  1. 虚引用(Phantom Reference)

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. ThreadLocal 为什么用弱引用?为什么还会内存泄漏?
  1. 软引用如何做精细的 LRU 缓存?
  1. DirectByteBuffer 泄漏如何排查?
  1. 弱引用能避免内存泄漏吗?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,Java 有四种引用强度,回收优先级从低到高是虚、弱、软、强,我用"什么时候能被 GC 回收"来区分。

强引用是最常见的,比如 Object o = new Object(),只要强引用存在,对象永不回收,内存不足直接 OOM。

软引用 SoftReference<T>,用于内存敏感型缓存。内存充足时保留,OOM 前会被回收,可通过构造参数设置 maxCapacity 精细控制。典型场景是图片缓存、Session 缓存。生产环境一般用 Caffeine/Guava Cache,底层就是软引用 + ReferenceQueue。

弱引用 WeakReference<T>,只要发生 GC 就回收,不等内存不足。典型场景就是 ThreadLocal——它的内部 ThreadLocalMap 用弱引用做 Key,目的是线程池线程不死时让 Key 可回收避免泄漏。但这里有个坑:Value 仍是强引用,所以手动 remove() 才是根本解法。另外 WeakHashMap、System.identityHashCode() 内部缓存也是弱引用。

虚引用 PhantomReference<T>,get() 永远返回 null,唯一用途是对象被 GC 时收到通知,必须搭配 ReferenceQueue 使用。典型场景是 DirectByteBuffer 堆外内存清理,JDK 9+ 底层改用 Cleaner 机制,本质还是虚引用 + ReferenceQueue。所以虚引用不是"用来引用对象"的,而是"监听对象死亡"的钩子。