Java 的四种引用类型
强引用
任何时候声明一个对象使用=
关联的引用,都是强引用,只要该强引用存在,就不会被垃圾回收器回收掉。当内存空间不足时,也不会随意清除任何一个强引用的对象。
软引用
软引用使用 SoftReference
进行声明,和强引用不同的是,如果堆内存空间不足时,会优先回收软引用。可以用于缓存数据。
1 | SoftReference<String[]> softBean = |
弱引用
弱引用使用 WeakReference
进行声明,和软引用的区别是,只要发生垃圾回收,弱引用就一定会被回收掉。
1 | WeakReference <String[]> weakBean = |
虚引用
虚引用使用 PhantomReference
进行声明,虚引用和其他引用不同,需要和一个ReferenceQueue
一同绑定使用。如果再回收前,发现是虚引用,会现将虚引用放到ReferenceQueue
中,执行完相关 hook 方法后,进行真正的回收。其目的是监测、跟踪垃圾回收器的行为。用于回收堆外内存。
- 当发现是虚引用,放到
ReferenceQueue
中。 - 另外一个线程,发现
ReferenceQueue
不为空,执行相关方法,清空堆外内存。 - 清空堆外内存后,对虚引用进行真正的回收。