[面试题] 什么是强引用、软引用、弱引用和虚引用?
📖 版块 A:知识讲解版 (温故知新)
-
强引用(Strong Reference):
- 最常见的引用形式,比如
Object obj = new Object()。 - 只要强引用还在,对象通常就不会被 GC 回收。
- 最常见的引用形式,比如
-
软引用(Soft Reference):
- 内存充足时通常不会回收。
- 内存紧张时,会优先回收软引用关联的对象。
- 适合实现内存敏感型缓存。
-
弱引用(Weak Reference):
- 比软引用更弱。
- 只要发生 GC,不管内存是否紧张,都可能被回收。
- 适合做弱键缓存、ThreadLocalMap 等场景的辅助设计。
-
虚引用(Phantom Reference):
- 最弱的一种引用。
- 它本身不影响对象生命周期,也拿不到对象实例。
- 通常配合
ReferenceQueue使用,用来跟踪对象即将被回收的时机。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:什么是强引用、软引用、弱引用和虚引用?
💬 高手逐字稿:
Java 的这四种引用,本质上是在表达:一个对象和 GC 之间,到底应该保持多强的存活关系。
最强的是强引用。这就是我们日常写代码时最常见的那种引用,只要强引用还指着一个对象,GC 通常就不会回收它。
接下来是软引用。软引用的意思可以理解成“这个对象我还想留着,但如果内存紧张了,你可以先回收它”。所以它特别适合做内存敏感型缓存。
再往下是弱引用。它比软引用更弱,只要发生 GC,不管当前内存紧不紧张,弱引用对象基本都有可能被清掉。所以它更适合那些“我只是临时挂一下,随时可以丢”的场景。
最弱的是虚引用。它和前面三种都不一样,因为它根本不是为了“继续用对象”而设计的。你拿着虚引用,是拿不到目标对象本身的,它通常必须配合 ReferenceQueue 一起用,主要目的是在对象真正被回收前后,感知这个时机,做一些资源清理或跟踪工作。
所以一句话总结:
- 强引用:尽量别回收;
- 软引用:内存不够再回收;
- 弱引用:只要 GC 就可能回收;
- 虚引用:不关心对象使用,只关心回收通知。
最后更新于: