很少有同学知道java里面的强弱软虚四种引用吧,今天来简单介绍一下。
java.lang.ref 下 SoftReference WeakReference PhantomReference 三个类,代表了软 弱 虚三种引用。
(1)强引用
我们一般,不使用其他三种方式的引用都是强引用,强引用就好比是生活中的必须品,对于jvm来说,只要对象被强引用,绝对是不能回收的,所以jvm即使内存泄露也不会回收,因此强引用也是内存泄露的一个原因
(2)软引用
软引用就比较软弱些了,jvm就喜欢欺负这样的,当jvm内存充足的时候,软引用没事,但是一旦内存不足,jvm就会清除软引用的对象。
软引用对于内存敏感度 程序中,是强引用很好的替代。
当程序需要大量创建某个类的新对象,而且有可能访问已创建的老对象时,可以充分使用软引用: 定义一个软引用数组 new SoftReference<> ,内存不足的时候,对象会被回收,不会造成内存泄露,强引用就会造成内存泄露。
(3)弱引用
弱引用更弱,内存充足的时候也会被回收,这就有个问题,弱引用的对象,你第二次使用的时候,可能已经是null了,所以要进行判断,
obj = wr.get();
if(obj == null){
obj = new();
wr = new WeakReference(obj);
}
(4)虚引用
虚引用单独存在没有意义,
【虚引用】phantomReference,虚引用形同虚设,不会决定对象的生命周期。如果一个一个对象仅持有虚引用,则和没有任何引用一样,在任何时候都会被回收。
【虚引用的使用】主要是跟踪对象被垃圾回收的活动。
虚引用必须和引用队列联合使用。当GC准备回收一个对象时,如果发现还有虚引用,则回收之前将虚引用加入与之关联的引用队列中。
程序用过判断引用队列中是否加入了虚引用来判断被引用的对象是否将要被回收。程序如果发现某个虚引用已经被加入到引用队列,则可以在所引用的对象被回收之前采取必要的活动。