先说结论
强度由强到弱 :强引用 > 软引用 > 弱引用 > 虚引用
在Java中,引用是指在程序中使用的指向对象的指针或句柄,可以用来访问对象的属性和方法。Java中有四种不同类型的引用:强引用、软引用、弱引用和虚引用。
1、强引用(Strong Reference)
强引用是最常见的引用类型,也是默认的引用类型。如果一个对象具有强引用,即使在内存不足的情况下,垃圾回收器也不会回收该对象。例如:
Object obj = new Object();
在这个示例中,obj是一个强引用,它指向一个新的Object对象。只要obj存在,该对象就不会被垃圾回收器回收。
2、软引用(Soft Reference)
软引用是一种比强引用弱的引用类型。如果一个对象只有软引用,那么当系统内存不足时,垃圾回收器可能会回收该对象,但不是一定回收。软引用通常用于缓存数据,如果系统内存不足,则可以清理缓存中的一些数据。例如:
SoftReference<Object> softRef = new SoftReference<>(new Object());
在这个示例中,softRef是一个软引用,它指向一个新的Object对象。如果系统内存不足,垃圾回收器可以回收该对象,但不是一定回收。
3、弱引用(Weak Reference)
弱引用比软引用更弱,如果一个对象只有弱引用,那么当垃圾回收器运行时,不论内存是否充足,都会回收该对象。弱引用通常用于实现回调函数和监听器,因为它们可以避免内存泄漏。例如:
WeakReference<Object> weakRef = new WeakReference<>(new Object());
在这个示例中,weakRef是一个弱引用,它指向一个新的Object对象。当垃圾回收器运行时,不论内存是否充足,都会回收该对象。
4、虚引用(Phantom Reference)
虚引用是最弱的引用类型,一个对象如果只有虚引用,那么在任何时候都可能被垃圾回收器回收。虚引用通常用于管理堆外内存,例如在DirectByteBuffer中,虚引用可以被用来跟踪垃圾回收器在内存不足时释放堆外内存。例如:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
在这个示例中,phantomRef是一个虚引用,它指向一个新的Object对象,并且有一个关联的ReferenceQueue。当垃圾回收器回收该对象时,它会将一个引用放入