java的內(nèi)存回收機(jī)制

java的內(nèi)存回收機(jī)制

ID:6121772

大小:309.50 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2018-01-03

java的內(nèi)存回收機(jī)制_第1頁(yè)
java的內(nèi)存回收機(jī)制_第2頁(yè)
java的內(nèi)存回收機(jī)制_第3頁(yè)
java的內(nèi)存回收機(jī)制_第4頁(yè)
java的內(nèi)存回收機(jī)制_第5頁(yè)
資源描述:

《java的內(nèi)存回收機(jī)制》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。

1、在Java中,它的內(nèi)存管理包括兩方面:內(nèi)存分配(創(chuàng)建Java對(duì)象的時(shí)候)和內(nèi)存回收,這兩方面工作都是由JVM自動(dòng)完成的,降低了Java程序員的學(xué)習(xí)難度,避免了像C/C++直接操作內(nèi)存的危險(xiǎn)。但是,也正因?yàn)閮?nèi)存管理完全由JVM負(fù)責(zé),所以也使Java很多程序員不再關(guān)心內(nèi)存分配,導(dǎo)致很多程序低效,耗內(nèi)存。因此就有了Java程序員到最后應(yīng)該去了解JVM,才能寫(xiě)出更高效,充分利用有限的內(nèi)存的程序。1.Java在內(nèi)存中的狀態(tài)首先我們先寫(xiě)一個(gè)代碼為例子:Person.java?packagetest;?impor

2、tjava.io.Serializable;?publicclassPersonimplementsSerializable{????staticfinallongserialVersionUID=1L;????Stringname;//姓名???????Personfriend;???//朋友????publicPerson(){}????????publicPerson(Stringname){????????super();????????this.name=name;?}?}Test.jav

3、a?packagetest;??publicclassTest{???publicstaticvoidmain(String[]args){????Personp1=newPerson("Kevin");????Personp2=newPerson("Rain");????Personp3=newPerson("Sunny");????????p1.friend=p2;?????????p3=p2;?????????p2=null;?}?}把上面Test.java中main方面里面的對(duì)象引用畫(huà)成一個(gè)

4、從main方法開(kāi)始的對(duì)象引用圖的話(huà)就是這樣的(頂點(diǎn)是對(duì)象和引用,有向邊是引用關(guān)系):當(dāng)程序運(yùn)行起來(lái)之后,把它在內(nèi)存中的狀態(tài)看成是有向圖后,可以分為三種:1)可達(dá)狀態(tài):在一個(gè)對(duì)象創(chuàng)建后,有一個(gè)以上的引用變量引用它。在有向圖中可以從起始頂點(diǎn)導(dǎo)航到該對(duì)象,那它就處于可達(dá)狀態(tài)。2)可恢復(fù)狀態(tài):如果程序中某個(gè)對(duì)象不再有任何的引用變量引用它,它將先進(jìn)入可恢復(fù)狀態(tài),此時(shí)從有向圖的起始頂點(diǎn)不能再導(dǎo)航到該對(duì)象。在這個(gè)狀態(tài)下,系統(tǒng)的垃圾回收機(jī)制準(zhǔn)備回收該對(duì)象的所占用的內(nèi)存,在回收之前,系統(tǒng)會(huì)調(diào)用finalize()方法

5、進(jìn)行資源清理,如果資源整理后重新讓一個(gè)以上引用變量引用該對(duì)象,則這個(gè)對(duì)象會(huì)再次變?yōu)榭蛇_(dá)狀態(tài);否則就會(huì)進(jìn)入不可達(dá)狀態(tài)。3)不可達(dá)狀態(tài):當(dāng)對(duì)象的所有關(guān)聯(lián)都被切斷,且系統(tǒng)調(diào)用finalize()方法進(jìn)行資源清理后依舊沒(méi)有使該對(duì)象變?yōu)榭蛇_(dá)狀態(tài),則這個(gè)對(duì)象將永久性失去引用并且變成不可達(dá)狀態(tài),系統(tǒng)才會(huì)真正的去回收該對(duì)象所占用的資源。上述三種狀態(tài)的轉(zhuǎn)換圖如下:2.Java對(duì)對(duì)象的4種引用1)強(qiáng)引用:創(chuàng)建一個(gè)對(duì)象并把這個(gè)對(duì)象直接賦給一個(gè)變量,eg:Personperson=newPerson("sunny");不管

6、系統(tǒng)資源有么的緊張,強(qiáng)引用的對(duì)象都絕對(duì)不會(huì)被回收,即使他以后不會(huì)再用到。2)軟引用:通過(guò)SoftReference類(lèi)實(shí)現(xiàn),eg:SoftReferencep=newSoftReference(newPerson("Rain"));,內(nèi)存非常緊張的時(shí)候會(huì)被回收,其他時(shí)候不會(huì)被回收,所以在使用之前要判斷是否為null從而判斷他是否已經(jīng)被回收了。3)弱引用:通過(guò)WeakReference類(lèi)實(shí)現(xiàn),eg:WeakReferencep=newWeakReferen

7、ce(newPerson("Rain"));不管內(nèi)存是否足夠,系統(tǒng)垃圾回收時(shí)必定會(huì)回收。4)虛引用:不能單獨(dú)使用,主要是用于追蹤對(duì)象被垃圾回收的狀態(tài)。通過(guò)PhantomReference類(lèi)和引用隊(duì)列ReferenceQueue類(lèi)聯(lián)合使用實(shí)現(xiàn),eg:packagetest;??importjava.lang.ref.PhantomReference;?importjava.lang.ref.ReferenceQueue;?publicclassTest{?????publicstati

8、cvoidmain(String[]args)??{?????????//創(chuàng)建一個(gè)對(duì)象?????????Personperson=newPerson("Sunny");????????????//創(chuàng)建一個(gè)引用隊(duì)列???????????ReferenceQueuerq=newReferenceQueue();?????????//創(chuàng)建一個(gè)虛引用,讓此虛引用引用到person對(duì)象?????????PhantomReference

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。