資源描述:
《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