一符匾、強(qiáng)引用(StrongReference)
不會(huì)回收有強(qiáng)引用的對(duì)象。
String str ="hello";//普通聲明就是強(qiáng)引用
str = null;//賦值為null蒿褂,JVM在合適的時(shí)間就會(huì)回收該對(duì)象
除了強(qiáng)引用偶宫,其他的引用都需要借助java.lang.ref包下的抽象類 Reference 的子類來(lái)進(jìn)行包裝操作了!在java.lang.ref包下惩歉,Reference類有3個(gè)具體的實(shí)現(xiàn)類,
SoftReference
铐维、WeakReference
和PhantomReference
柬泽,分別表示軟引用、弱引用和虛引用嫁蛇!
二、軟引用(SoftReference)
如果內(nèi)存空間足夠露该,就不會(huì)回收它睬棚;如果內(nèi)存空間不足,就會(huì)回收解幼。
String str=new String("abc"); // 強(qiáng)引用
SoftReference<String> soft = new SoftReference<String>(str); // 軟引用
//軟引用包含的對(duì)象可以通過(guò)get()獲取到
soft.get();
-------
//提醒系統(tǒng)進(jìn)行一個(gè)垃圾收集
System.gc();
System.out.println(soft.get() == null);//打印false抑党,說(shuō)明軟引用中的對(duì)象并沒(méi)有被回收!
三撵摆、弱引用(WeakReference)
不管當(dāng)前內(nèi)存空間足夠與否底靠,都會(huì)回收。
// 創(chuàng)建一個(gè)引用隊(duì)列
ReferenceQueue<String> rq = new ReferenceQueue<String>();
// 實(shí)現(xiàn)一個(gè)弱引用特铝,將強(qiáng)引用類型hello和是實(shí)例化的rq放到弱引用實(shí)現(xiàn)里面
WeakReference<String> weak = new WeakReference<String>(new String("hello"), rq);
// 通過(guò)弱引用get方法獲取強(qiáng)引用中創(chuàng)建的內(nèi)存空間hello值
System.out.println(weak.get());
System.gc(); //通知JVM的gc進(jìn)行垃圾回收
System.out.println(weak.get() == null);//打印true暑中,說(shuō)明弱引用中的對(duì)象被回收了!
-----------
//創(chuàng)建一個(gè)弱引用鲫剿,包含一個(gè)對(duì)象
WeakReference<Integer> weak = new WeakReference<>(new Integer("23456"));
//弱引用包含的對(duì)象可以通過(guò)get()獲取到
Integer weakNum = weak.get();
四鳄逾、虛引用(PhantomReference)
和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收灵莲。
//創(chuàng)建一個(gè)虛引用雕凹,包含一個(gè)對(duì)象
ReferenceQueue<Integer> intRq = new ReferenceQueue<>();
PhantomReference<Integer> phantom = new PhantomReference<>(new Integer("23456"),intRq);
//引用包含的對(duì)象可以通過(guò)get()獲取到
Integer phantomNum = phantom.get();
- 無(wú)法通過(guò)虛引用來(lái)獲取對(duì)一個(gè)對(duì)象的真實(shí)引用。
- 虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。
- 唯一的用處:能在對(duì)象被GC時(shí)收到系統(tǒng)通知枚抵。
- 如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列线欲,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)。