多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > java的四種引用,強弱軟虛,用到的場景

java的四種引用,強弱軟虛,用到的場景

來源:程序員人生   發布時間:2017-03-10 09:26:17 閱讀次數:3800次

1、強援用(StrongReference)

強援用是使用最普遍的援用。如果1個對象具有強援用,那垃圾回收器絕不會回收它。以下:

  Object o=new Object();   //  強援用

當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError毛病,使程序異常終止,也不會靠隨便回收具有強援用的對象來解決內存不足的問題。如果不使用時,要通過以下方式來弱化援用,以下:

 o=null;     // 幫助垃圾搜集器回收此對象

顯式地設置o為null,或超越對象的生命周期范圍,則gc認為該對象不存在援用,這時候就能夠回收這個對象。具體甚么時候搜集這要取決于gc的算法。

舉例:

public void test(){

Object o=new Object();

// 省略其他操作

 }

在1個方法的內部有1個強援用,這個援用保存在棧中,而真實的援用內容(Object)保存在堆中。當這個方法運行完成后就會退出方法棧,則援用內容的援用不存在,這個Object會被回收。

但是如果這個o是全局的變量時,就需要在不用這個對象時賦值為null,由于強援用不會被垃圾回收。

強援用在實際中有非常重要的用途,舉個ArrayList的實現源代碼:

 private transient Object[] elementData;

 public void clear() {

    modCount++;

    // Let gc do its work

    for (int i = 0; i < size; i++)

        elementData[i] = null;

    size = 0;

      }

在ArrayList類中定義了1個私有的變量elementData數組,在調用方法清空數組時可以看到為每一個數組內容賦值為null。不同于elementData=null,強援用依然存在,避免在后續調用 add()等方法添加元素時進行重新的內存分配。使用如clear()方法中釋放內存的方法對數組中寄存的援用類型特別適用,這樣就能夠及時釋放內存。

2、軟援用(SoftReference)

如果1個對象只具有軟援用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟援用可用來實現內存敏感的高速緩存。

String str=new String("abc");                                     // 強援用

SoftReference<String> softRef=new SoftReference<String>(str);     // 軟援用

當內存不足時,等價于:

If(JVM.內存不足()) {

  str = null;  // 轉換為軟援用

  System.gc(); // 垃圾回收器進行回收
}

虛援用在實際中有重要的利用,例如閱讀器的后退按鈕。按后退時,這個后退時顯示的網頁內容是重新進行要求還是從緩存中取出呢?這就要看具體的實現策略了。

(1)如果1個網頁在閱讀結束時就進行內容的回收,則按后退查看前面閱讀過的頁面時,需要重新構建

(2)如果將閱讀過的網頁存儲到內存中會造成內存的大量浪費,乃至會造成內存溢出

這時候候就能夠使用軟援用

Browser prev = new Browser();               // 獲得頁面進行閱讀

SoftReference sr = new SoftReference(prev); // 閱讀終了后置為軟援用    

if(sr.get()!=null){ 

rev = (Browser) sr.get();           // 還沒有被回收器回收,直接獲得

}else{

prev = new Browser();               // 由于內存吃緊,所以對軟援用的對象回收了

sr = new SoftReference(prev);       // 重新構建

}

這樣就很好的解決了實際的問題。

軟援用可以和1個援用隊列(ReferenceQueue)聯合使用,如果軟援用所援用的對象被垃圾回收器回收,Java虛擬機就會把這個軟援用加入到與之關聯的援用隊列中。

3、弱援用(WeakReference)

弱援用與軟援用的區分在于:只具有弱援用的對象具有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的進程中,1旦發現了只具有弱援用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是1個優先級很低的線程,因此不1定會很快發現那些只具有弱援用的對象。

 String str=new String("abc");    

WeakReference<String> abcWeakRef = new WeakReference<String>(str);

str=null;

當垃圾回收器進行掃描回收時等價于:

str = null;

System.gc();

如果這個對象是偶爾的使用,并且希望在使用時隨時就可以獲得到,但又不想影響此對象的垃圾搜集,那末你應當用 Weak Reference 來記住此對象。

下面的代碼會讓str再次變成1個強援用:

String  abc = abcWeakRef.get();

弱援用可以和1個援用隊列(ReferenceQueue)聯合使用,如果弱援用所援用的對象被垃圾回收,Java虛擬機就會把這個弱援用加入到與之關聯的援用隊列中。

當你想援用1個對象,但是這個對象有自己的生命周期,你不想參與這個對象的生命周期,這時候候你就是用弱援用。

這個援用不會在對象的垃圾回收判斷中產生任何附加的影響。

public class ReferenceTest {



private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>();



public static void checkQueue() {

    Reference<? extends VeryBig> ref = null;

    while ((ref = rq.poll()) != null) {

        if (ref != null) {

            System.out.println("In queue: "   + ((VeryBigWeakReference) (ref)).id);

        }

    }

}



public static void main(String args[]) {

    int size = 3;

    LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<WeakReference<VeryBig>>();

    for (int i = 0; i < size; i++) {

        weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));

        System.out.println("Just created weak: " + weakList.getLast());



    }



    System.gc(); 

    try { // 下面休息幾分鐘,讓上面的垃圾回收線程運行完成

        Thread.currentThread().sleep(6000);

    } catch (InterruptedException e) {

        e.printStackTrace();

    }

    checkQueue();

} 
 }



class VeryBig {

public String id;

// 占用空間,讓線程進行回收

byte[] b = new byte[2 * 1024];



public VeryBig(String id) {

    this.id = id;

}



protected void finalize() {

    System.out.println("Finalizing VeryBig " + id);

}
}



class VeryBigWeakReference extends WeakReference<VeryBig> {

public String id;



public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) {

    super(big, rq);

    this.id = big.id;

}



protected void finalize() {

    System.out.println("Finalizing VeryBigWeakReference " + id);

}

}

最后的輸出結果為:

Just created weak: com.javabase.reference.VeryBigWeakReference@1641c0

Just created weak: com.javabase.reference.VeryBigWeakReference@136ab79

Just created weak: com.javabase.reference.VeryBigWeakReference@33c1aa

Finalizing VeryBig Weak 2

Finalizing VeryBig Weak 1

Finalizing VeryBig Weak 0

In queue: Weak 1

In queue: Weak 2

In queue: Weak 0

4、虛援用(PhantomReference)

“虛援用”顧名思義,就是形同虛設,與其他幾種援用都不同,虛援用其實不會決定對象的生命周期。如果1個對象僅持有虛援用,那末它就和沒有任何援用1樣,在任什么時候候都可能被垃圾回收器回收。

虛援用主要用來跟蹤對象被垃圾回收器回收的活動。虛援用與軟援用和弱援用的1個區分在于:虛援用必須和援用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收1個對象時,如果發現它還有虛援用,就會在回收對象的內存之前,把這個虛援用加入到與之關聯的援用隊列中。

5、總結

Java4種援用的級別由高到低順次為:

強援用 > 軟援用 > 弱援用 > 虛援用

通過圖來看1下他們之間在垃圾回收時的區分:

當垃圾回收器回收時,某些對象會被回收,某些不會被回收。垃圾回收器會從根對象Object來標記存活的對象,然后將某些不可達的對象和1些援用的對象進行回收.

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲区小说区激情区图片区 | 国产亚洲美女精品久久久久 | 中文字幕一区二区在线视频 | 韩国v欧美v亚洲v日本v | 日本在线无 | 久爱免费视频 | www.yw尤物| 久久久久777777人人人视频 | 日韩 欧美 自拍 在线 视频 | 久久久亚洲国产精品主播 | 中文字幕乱码视频中文字幕14 | 黄色毛片大全 | 亚洲一区二区精品 | 一区小说二区另类小说三区图 | 酒色成人网| 国产在线不卡免费播放 | 久久久www免费看片 久久久www免费人成看片 | 日本janpanese护士 | 一级做a免费视频观看网站 一级做a爰片久久毛片 | 欧美3| 国产精品一区二区三区免费视频 | 午夜在线精品不卡国产 | 国产一级精品高清一级毛片 | 国产偷v国产偷v亚洲高清 | 成人做视频免费 | 国产人澡人澡澡澡人碰视频 | 欧美成人精品高清在线观看 | 毛片免费毛片一级jjj毛片 | 成人毛片免费视频播放 | 中文乱码字幕午夜无线观看 | 欧美亚洲国产成人精品 | 成人久久伊人精品伊人 | 韩国三级在线观看我不卡 | 伊人影院在线观看 | 欧洲大片在线播放 | 亚洲制服欧美自拍另类 | 91精品国产闺蜜国产在线闺蜜 | 一区二区三区四区 | 亚洲一级二级三级 | 国内成人精品亚洲日本语音 | 国产精品系列在线一区 |