資源描述:
《java的內(nèi)存回收機(jī)制》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、在Java中,它的內(nèi)存管理包括兩方面:內(nèi)存分配(創(chuàng)建Java對象的時(shí)候)和內(nèi)存回收,這兩方面工作都是由JVM自動完成的,降低了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,才能寫出更高效,充分利用有限的內(nèi)存的程序。1.Java在內(nèi)存中的狀態(tài)首先我們先寫一個(gè)代碼為例子:Person.java?packagetest;?importjava.i
2、o.Serializable;?publicclassPersonimplementsSerializable{????staticfinallongserialVersionUID=1L;????Stringname;//姓名???????Personfriend;???//朋友????publicPerson(){}????????publicPerson(Stringname){????????super();????????this.name=name;?}?}Test.java?packagetest;
3、??publicclassTest{???publicstaticvoidmain(String[]args){????Personp1=newPerson("Kevin");????Personp2=newPerson("Rain");????Personp3=newPerson("Sunny");????????p1.friend=p2;?????????p3=p2;?????????p2=null;?}?}把上面Test.java中main方面里面的對象引用畫成一個(gè)從main方法開始的對象引用圖的話就是這樣
4、的(頂點(diǎn)是對象和引用,有向邊是引用關(guān)系):當(dāng)程序運(yùn)行起來之后,把它在內(nèi)存中的狀態(tài)看成是有向圖后,可以分為三種:1)可達(dá)狀態(tài):在一個(gè)對象創(chuàng)建后,有一個(gè)以上的引用變量引用它。在有向圖中可以從起始頂點(diǎn)導(dǎo)航到該對象,那它就處于可達(dá)狀態(tài)。2)可恢復(fù)狀態(tài):如果程序中某個(gè)對象不再有任何的引用變量引用它,它將先進(jìn)入可恢復(fù)狀態(tài),此時(shí)從有向圖的起始頂點(diǎn)不能再導(dǎo)航到該對象。在這個(gè)狀態(tài)下,系統(tǒng)的垃圾回收機(jī)制準(zhǔn)備回收該對象的所占用的內(nèi)存,在回收之前,系統(tǒng)會調(diào)用finalize()方法進(jìn)行資源清理,如果資源整理后重新讓一個(gè)以上引用變量引用該
5、對象,則這個(gè)對象會再次變?yōu)榭蛇_(dá)狀態(tài);否則就會進(jìn)入不可達(dá)狀態(tài)。3)不可達(dá)狀態(tài):當(dāng)對象的所有關(guān)聯(lián)都被切斷,且系統(tǒng)調(diào)用finalize()方法進(jìn)行資源清理后依舊沒有使該對象變?yōu)榭蛇_(dá)狀態(tài),則這個(gè)對象將永久性失去引用并且變成不可達(dá)狀態(tài),系統(tǒng)才會真正的去回收該對象所占用的資源。上述三種狀態(tài)的轉(zhuǎn)換圖如下:2.Java對對象的4種引用1)強(qiáng)引用:創(chuàng)建一個(gè)對象并把這個(gè)對象直接賦給一個(gè)變量,eg:Personperson=newPerson("sunny");不管系統(tǒng)資源有么的緊張,強(qiáng)引用的對象都絕對不會被回收,即使他以后不會再用到
6、。2)軟引用:通過SoftReference類實(shí)現(xiàn),eg:SoftReferencep=newSoftReference(newPerson("Rain"));,內(nèi)存非常緊張的時(shí)候會被回收,其他時(shí)候不會被回收,所以在使用之前要判斷是否為null從而判斷他是否已經(jīng)被回收了。3)弱引用:通過WeakReference類實(shí)現(xiàn),eg:WeakReferencep=newWeakReference(newPerson("Rain"));不管內(nèi)存是否足夠,系統(tǒng)垃
7、圾回收時(shí)必定會回收。4)虛引用:不能單獨(dú)使用,主要是用于追蹤對象被垃圾回收的狀態(tài)。通過PhantomReference類和引用隊(duì)列ReferenceQueue類聯(lián)合使用實(shí)現(xiàn),eg:packagetest;??importjava.lang.ref.PhantomReference;?importjava.lang.ref.ReferenceQueue;?publicclassTest{?????publicstaticvoidmain(String[]args)??{?????????//創(chuàng)建一個(gè)對象??????
8、???Personperson=newPerson("Sunny");????????????//創(chuàng)建一個(gè)引用隊(duì)列???????????ReferenceQueuerq=newReferenceQueue();?????????//創(chuàng)建一個(gè)虛引用,讓此虛引用引用到person對象?????????PhantomReference