在Java中,除了强引用(Strong Reference)外,还有三种其他类型的引用:软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。它们在垃圾回收机制中的作用和区别如下:
-
强引用
- 只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收。
- 强引用Strong Reference:最为常见,比如new一个对象,这样的变量声明和定义就会产生对该对象的强引用。只要求强引用指向,并且 GC Roots 可达,那么 Java 内存回收时,即使濒临内存耗尽,也不会回收该对象。
-
软引用(Soft Reference):
- 软引用通过SoftReference类来实现,它的作用是使对象能够在内存不足时被垃圾回收器回收,但只有在内存真正不足时才会回收。当一个对象只被软引用指向时,垃圾回收器会尽量保留该对象,直到内存不足时才会回收它。软引用通常用于实现内存敏感的缓存,比如图片缓存等,使得缓存中的对象在内存不足时可以被回收,以避免OOM(OutOfMemoryError)异常的发生。
-
弱引用(Weak Reference):
- 弱引用通过WeakReference类来实现,它的作用是在垃圾回收时,只要对象只被弱引用所指向,不管内存是否充足,都会被回收。垃圾回收器对弱引用的对象进行垃圾回收的时候,会将这些对象标记为可回收的,然后在后续的垃圾回收周期内将它们回收掉。弱引用常用于解决内存泄漏问题,比如一些缓存或者监听器的场景,允许在没有强引用指向时自动释放资源。
-
虚引用(Phantom Reference):
- 虚引用通过PhantomReference类来实现,它的作用是在垃圾回收时提供了一种确保对象被回收的机制,但与软引用和弱引用不同,虚引用并不影响对象的生命周期。虚引用在被垃圾回收器回收时,会收到一个通知,可以通过这个通知进行一些后续操作,比如清理资源或者执行特定的逻辑。虚引用主要用于管理堆外内存,如使用java.nio.Buffer进行直接内存访问,需要手动释放的情况。
区别总结:
- 强引用是默认的引用类型,只要有强引用指向一个对象,该对象就不会被垃圾回收。
- 软引用会在内存不足时被垃圾回收,用于实现内存敏感的缓存。
- 弱引用无论内存是否充足,在垃圾回收时都会被回收,常用于解决内存泄漏问题。
- 虚引用在对象被回收时收到通知,可以进行后续操作,主要用于管理堆外内存。
- 使用不同类型的引用可以帮助开发者更灵活地控制对象的生命周期,以及在某些场景下实现更高效的内存管理。