四种援用类型
JDK1.2 之前,一个对象只有“已被援用”和 ” 未被援用 ” 两种状态,这将无奈形容某些非凡状况下的对象,比方,当内存短缺时须要保留,而内存缓和时才须要被摈弃的一类对象。
所以在 JDK.1.2 之后,Java 对援用的概念进行了裁减,将援用分为了:强援用(Strong Reference)、软援用(Soft Reference)、弱援用(Weak Reference)、虚援用(Phantom Reference)4 种,这 4 种援用的强度顺次削弱。
一,强援用
Object obj = new Object(); // 只有 obj 还指向 Object 对象,Object 对象就不会被回收 obj = null; // 手动置 null
只有强援用存在,垃圾回收器将永远不会回收被援用的对象,哪怕内存不足时,JVM 也会间接抛出 OutOfMemoryError,不会去回收。如果想中断强援用与对象之间的分割,能够显示的将强援用赋值为 null,这样一来,JVM 就能够适时的回收对象了
二,软援用
软援用是用来形容一些非必须但仍有用的对象。在内存足够的时候,软援用对象不会被回收,只有在内存不足时,零碎则会回收软援用对象,如果回收了软援用对象之后依然没有足够的内存,才会抛出内存溢出异样。这种个性经常被用来实现缓存技术,比方网页缓存,图片缓存等。
在 JDK1.2 之后,用 java.lang.ref.SoftReference 类来示意软援用。
三,弱援用
弱援用的援用强度比软援用要更弱一些,无论内存是否足够,只有 JVM 开始进行垃圾回收,那些被弱援用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来示意弱援用。
四,虚援用
虚援用是最弱的一种援用关系,如果一个对象仅持有虚援用,那么它就和没有任何援用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来示意,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 办法,而且它的 get() 办法仅仅是返回一个 null,也就是说将永远无奈通过虚援用来获取对象,虚援用必须要和 ReferenceQueue 援用队列一起应用。