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

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

?1.對象的創(chuàng)建與可達(dá)

??Java中,所有對象都是通過new關(guān)鍵字來創(chuàng)建的,JVM會(huì)在堆內(nèi)存中開辟一塊空間來存儲(chǔ)對象。在創(chuàng)建對象時(shí)一般都會(huì)有引用來指向他,(匿名對象除外)這樣我們就能通過引用來找到當(dāng)前這個(gè)對象。由于對象又是由一條一條線程創(chuàng)建的,因此,把Java對象的創(chuàng)建當(dāng)成一種有向圖的話,那么線程對象就是有向圖的起點(diǎn)。所以當(dāng)有引用指向Java對象時(shí),線程對象到Java對象就是可達(dá)的,如果沒有引用指向Java對象時(shí),線程對象到Java對象就是不可達(dá)的。

?2.垃圾回收機(jī)制

??如果Java對象是不可達(dá)的,那么JVM的垃圾回收機(jī)制就會(huì)主動(dòng)回收他們了。在這里需說明一下,除了可達(dá)狀態(tài)和不可達(dá)狀態(tài)還有一個(gè)可恢復(fù)狀態(tài),如果Java對象在失去所有引用時(shí),調(diào)用finalize方法能夠拿到指向他的引用,恢復(fù)到可達(dá)狀態(tài),JVM就不會(huì)回收該Java對象。

?3.內(nèi)存回收機(jī)制技巧

??1.在使用包裝類或者String類時(shí),不應(yīng)用new的方式來創(chuàng)建,而是使用直接量來創(chuàng)建他們,如String類就應(yīng)這樣

String str1 = "123";
//而不應(yīng)該
String str2 = new String("123");

??2.在字符串拼接時(shí)使用StringBuilder和StringBuffer而不使用String
??3.盡早釋放無用對象的引用
??4.盡量少用靜態(tài)變量
??5.避免在循環(huán)中創(chuàng)建Java對象,而是在外面創(chuàng)建。
??6.緩存經(jīng)常使用的對象,如數(shù)據(jù)庫連接池,線程池等
??7.盡量不要使用finalize()方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容