Java內(nèi)存回收機制
?1.對象的創(chuàng)建與可達
??Java中躏嚎,所有對象都是通過new關(guān)鍵字來創(chuàng)建的,JVM會在堆內(nèi)存中開辟一塊空間來存儲對象仗扬。在創(chuàng)建對象時一般都會有引用來指向他,(匿名對象除外)這樣我們就能通過引用來找到當(dāng)前這個對象。由于對象又是由一條一條線程創(chuàng)建的朝抖,因此,把Java對象的創(chuàng)建當(dāng)成一種有向圖的話谍珊,那么線程對象就是有向圖的起點槽棍。所以當(dāng)有引用指向Java對象時,線程對象到Java對象就是可達的抬驴,如果沒有引用指向Java對象時炼七,線程對象到Java對象就是不可達的。
?2.垃圾回收機制
??如果Java對象是不可達的布持,那么JVM的垃圾回收機制就會主動回收他們了豌拙。在這里需說明一下,除了可達狀態(tài)和不可達狀態(tài)還有一個可恢復(fù)狀態(tài)题暖,如果Java對象在失去所有引用時按傅,調(diào)用finalize方法能夠拿到指向他的引用,恢復(fù)到可達狀態(tài)胧卤,JVM就不會回收該Java對象唯绍。
?3.內(nèi)存回收機制技巧
??1.在使用包裝類或者String類時,不應(yīng)用new的方式來創(chuàng)建枝誊,而是使用直接量來創(chuàng)建他們况芒,如String類就應(yīng)這樣
String str1 = "123";
//而不應(yīng)該
String str2 = new String("123");
??2.在字符串拼接時使用StringBuilder和StringBuffer而不使用String
??3.盡早釋放無用對象的引用
??4.盡量少用靜態(tài)變量
??5.避免在循環(huán)中創(chuàng)建Java對象,而是在外面創(chuàng)建叶撒。
??6.緩存經(jīng)常使用的對象绝骚,如數(shù)據(jù)庫連接池,線程池等
??7.盡量不要使用finalize()方法