分享JVM的四種引用方式_第1頁
分享JVM的四種引用方式_第2頁
分享JVM的四種引用方式_第3頁
分享JVM的四種引用方式_第4頁
分享JVM的四種引用方式_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第分享JVM的四種引用方式目錄前言一、強引用二、軟引用三、弱引用四、虛引用

前言

Java中提供這四種引用類型主要有兩個目的:

可以讓程序員通過代碼的方式?jīng)Q定某些對象的生命周期;有利于JVM進(jìn)行垃圾回收

java.lang.ref包下的引用類結(jié)構(gòu)圖:

一、強引用

特點:GC時,永遠(yuǎn)不會被回收

是指創(chuàng)建一個對象并把這個對象賦給一個引用變量。

比如:

Objectobject=newObject();

Stringstr="hello"

強引用有引用變量指向時永遠(yuǎn)不會被垃圾回收,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象。

publicvoidfun1(){

Objectobject=newObject();

Object[]objArr=newObject[1000];

}

當(dāng)運行至Object[]objArr=newObject[1000];這句時,如果內(nèi)存不足,JVM會拋出OOM錯誤也不會回收object指向的對象。不過要注意的是,當(dāng)fun1運行完之后,object和objArr都已經(jīng)不存在了,所以它們指向的對象都會被JVM回收。

如果想中斷強引用和某個對象之間的關(guān)聯(lián),可以顯示地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。比如Vector類的clear方法中就是通過將引用賦值為null來實現(xiàn)清理工作的

強引用也是導(dǎo)致內(nèi)存泄露的主要原因

二、軟引用

特點:內(nèi)存不足時(自動觸發(fā)GC),會被回收

如果一個對象具有軟引用,內(nèi)存空間足夠,垃圾回收器就不會回收它;如果內(nèi)存空間不足了,就會回收這些對象的內(nèi)存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存,比如網(wǎng)頁緩存、圖片緩存等。使用軟引用能防止內(nèi)存泄露,增強程序的健壯性。

SoftReference的特點是它的一個實例保存對一個Java對象的軟引用,該軟引用的存在不妨礙垃圾收集線程對該Java對象的回收。也就是說,一旦SoftReference保存了對一個Java對象的軟引用后,在垃圾線程對這個Java對象回收前,SoftReference類所提供的get()方法返回Java對象的強引用。另外,一旦垃圾線程回收該Java對象之后,get()方法將返回null。

示例:

JVM參數(shù)-Xms10m-Xmx10m-XX:+PrintGCDetails

publicstaticvoidmain(String[]args){

Objectobj=newObject();

SoftReferenceObjectsoftRef=newSoftReferenceObject(obj);

System.out.println(obj);

System.out.println(softRef.get());

//對象要設(shè)置為null,否則不會被回收。原因:通過設(shè)置為null讓對象失去引用,方便GC

//備注:因為在這個main方法中(主線程),方法未結(jié)束之前,不設(shè)置為null,對象是不會失去引用的。

obj=null;

//當(dāng)內(nèi)存不足時,會自動觸發(fā)GC操作,這里就無需手動GC

try{

byte[]b=newbyte[30*1024*1024];

}catch(Exceptione){

//TODO:handleexception

}finally{

System.out.println(obj);

System.out.println(softRef.get());

}

上述示例說明,軟引用在內(nèi)存不夠時,通過系統(tǒng)的GC,回收對象了

假如有一個應(yīng)用需要讀取大量的本地圖片:

如果每次讀取圖片都從硬盤中讀取則會嚴(yán)重影響性能如果一次全部加載到內(nèi)存中又可能會造成內(nèi)存溢出

此時使用軟引用可以解決這個問題。

設(shè)計思路:用一個HashMap來保存圖片的路徑的相應(yīng)圖片對象關(guān)聯(lián)的軟引用之間的映射關(guān)系,在內(nèi)存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免OOM的問題。

MapString,SoftRefrenceBitmapimageCache=newHashMapString,SoftRefrenceBitmap();

三、弱引用

特點:無論內(nèi)存是否充足,只要進(jìn)行GC,都會被回收

引用也是用來描述非必需對象的,當(dāng)JVM進(jìn)行垃圾回收時,無論內(nèi)存是否充足,都會回收被弱引用關(guān)聯(lián)的對象。在java中,用java.lang.ref.WeakReference類來表示

示例:

publicstaticvoidmain(String[]args){

Objectobj=newObject();

WeakReferenceObjectweakRef=newWeakReferenceObject(obj);

System.out.println(obj);//java.lang.Object@7852e922

System.out.println(weakRef.get());//java.lang.Object@7852e922

//對象要設(shè)置為null,否則不會被回收。原因:通過設(shè)置為null讓對象失去引用,方便GC

//備注:因為在這個main方法中(主線程),方法未結(jié)束之前,不設(shè)置為null,對象是不會失去引用的。

obj=null;

//這里通過手動觸發(fā)GC操作。否則內(nèi)存充足的情況下很難自動觸發(fā)GC

System.gc();

System.out.println(obj);//null

System.out.println(weakRef.get());//null

}

上述示例表明,在內(nèi)存充足的情況下,弱引用的對象也被回收了。

WeakHashMap的用法

publicstaticvoidmain(String[]args){

WeakHashMapString,StringweakMap=newWeakHashMapString,String

Stringkey="1";

weakMap.put(key,"test");

System.out.println(weakMap);//{1=test}

System.out.println(weakMap.get(key));//test

key=null;

System.gc();

System.out.println(weakMap);//{1=test}

System.out.println(weakMap.get(key));//null

}

軟引用和弱引用的使用場景:mybatis中的緩存

四、虛引用

特點:如同虛設(shè),和沒有引用沒什么區(qū)別

虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關(guān)聯(lián),則跟沒有引用與之關(guān)聯(lián)一樣,在任何時候都可能被垃圾回收器回收。

要注意的是,虛引用必須和引用隊列關(guān)聯(lián)使用,當(dāng)垃圾回收器準(zhǔn)備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會把這個虛引用加入到與之關(guān)聯(lián)的引用隊列中。程序可以通過判斷引用隊列中是否已經(jīng)加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個虛引用已經(jīng)被加入到引用隊列,那么就可以在所引用的對象的內(nèi)存被回收之前采取必要的行動。

示例:

publicstaticvoidmain(String[]args){

Objectobj=newObject();

ReferenceQueueStringqueue=newReferenceQueueString

PhantomReferenceStringpr=newPhantomReferenceString(obj,queue);

System.out.println(pr.get());//null

}

虛引用的主要作用是跟蹤對象被垃圾回收的狀態(tài)。僅僅是提供了一種確保對象被finalize以后,做某些事情的機制。PhantomRefrence的get方法總是返回null,因此無法訪問對應(yīng)的引用對象。其意義在于說明一個對象已經(jīng)進(jìn)入finalization階段,可以被GC回收,用來實現(xiàn)比finalization機制更靈活的回收操作。

換句話說,設(shè)置虛引用關(guān)聯(lián)的唯一目的,就是在這個對象被收集器回收的時候收到一個系統(tǒng)通知或者后續(xù)添加進(jìn)一步的處理。Java技術(shù)允許使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除之前做必要的清理工作。

引用隊列的用法:

publicstaticvoidmain(String[]args){

Objectobj=newObject();

ReferenceQueueObjectqueue=newReferenceQueueObject

WeakReferenceObjectweakRef=newWeakReferenceObject(obj,queue);

System.out.println(obj);//java.lang.Object@7852e922

System.out.println(weakRef.get());//java.lang.Object@7852e922

System.ou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論