四种引用类型
Java 中有强引用、软引用、弱引用和虚引用四种引用类型。
强引用
强引用是最普通的对象引用,只要强引用还存在,GC 就不会回收对象。最常见的例子是Object obj = new Object()。只要对象仍然被强引用指向,垃圾回收器就不会回收它;即使内存不足,也可能抛出OutOfMemoryError。
软引用
软引用通过SoftReference实现。内存充足时,软引用对象通常不会被回收;内存紧张时,垃圾回收器可能清理软引用对象,因此常用于内存敏感型缓存。不过它的回收时机由 JVM 决定,不能作为严格可靠的缓存机制。
弱引用
弱引用通过WeakReference实现。如果对象只剩弱引用,没有强引用或其他更强的引用指向它,那么下一次垃圾回收时就可能被回收,与当前内存是否充足没有直接关系。
ThreadLocalMap的 key 是弱引用,弱引用指向ThreadLocal对象,value 仍然是对业务对象的强引用,所以使用完ThreadLocal后仍要调用remove()。
虚引用
虚引用通过PhantomReference实现,不影响对象存活,也不能通过get()获取对象。它通常配合ReferenceQueue使用,在对象即将被回收时接收通知,用于资源清理和回收监控。
速记
- 强引用:只要还在,就不回收。
- 软引用:内存不足时可能回收。
- 弱引用:下一次 GC 可能回收。
- 虚引用:不能取对象,主要用于回收跟踪。