1.垃圾回收機(jī)制只負(fù)責(zé)回收堆內(nèi)存中的對(duì)象,不會(huì)回收任何物理資源(如數(shù)據(jù)庫連接,網(wǎng)絡(luò)IO等資源)
2.程序無法精確控制垃圾回收的運(yùn)行,垃圾回收會(huì)在合適的時(shí)候運(yùn)行。當(dāng)對(duì)象永久的失去引用后,系統(tǒng)會(huì)在合適的時(shí)間回收其占用的內(nèi)存。
3.在垃圾回收機(jī)制回收任何對(duì)象之前,總會(huì)先調(diào)用它的finalize()方法。
對(duì)象在內(nèi)存中的狀態(tài):
可 達(dá) 狀 態(tài):當(dāng)一個(gè)對(duì)象被創(chuàng)建后,若有一個(gè)以上的引用變量引用他,則這個(gè)對(duì)象在程序中處于可達(dá)狀態(tài),程序可通過引用變量來調(diào)用該對(duì)象的實(shí)例變量和方法。
可恢復(fù)狀態(tài):如果程序中某個(gè)變量不在有任何引用變量引用它,它就進(jìn)入了可恢復(fù)狀態(tài)。在這種狀態(tài)下,垃圾回收機(jī)制會(huì)準(zhǔn)備回收這個(gè)變量所對(duì)應(yīng)的內(nèi)存,在回收該對(duì)象之前,系 統(tǒng)會(huì)調(diào)用所用可恢復(fù)對(duì)象的fnalize()方法,如果此時(shí)有一個(gè)引用變量引用該對(duì)象,該對(duì)象就重新變?yōu)榭蛇_(dá)狀態(tài)。
不可達(dá)狀態(tài):當(dāng)對(duì)象和所用引用變量的聯(lián)系被切斷,且系統(tǒng)已經(jīng)調(diào)用了該對(duì)象的finalize()方法,仍沒有使該對(duì)象變?yōu)榭蛇_(dá)狀態(tài)。此時(shí)該對(duì)象進(jìn)入不可達(dá)狀態(tài),只有當(dāng)對(duì)象處于不可達(dá)狀態(tài)時(shí),系統(tǒng)才會(huì)開始回收該對(duì)象占用的資源。
public class StatusTranfer{ public static void test(){ //執(zhí)行此步時(shí),對(duì)象12345處于可達(dá)狀態(tài) String a = new String("12345"); //執(zhí)行到此步時(shí),對(duì)象12345處于可恢復(fù)狀態(tài) //對(duì)象123處于可達(dá)狀態(tài) a = new String("123"); } public static void main(String[] args) { test(); }}強(qiáng)制垃圾回收 程序只能控制一個(gè)對(duì)象什么時(shí)候不被引用變量引用,但不能控制系統(tǒng)什么時(shí)候進(jìn)行垃圾回收。
程序無法精確控制java垃圾回收的時(shí)機(jī),但仍然能夠強(qiáng)制系統(tǒng)進(jìn)行垃圾回收————這種強(qiáng)制只是通知系統(tǒng)進(jìn)行垃圾回收,但系統(tǒng)是否進(jìn)行垃圾回收仍然不確定。大部分時(shí)候,程序強(qiáng)制系統(tǒng)進(jìn)行垃圾回收會(huì)有一些效果。
強(qiáng)制垃圾回收的兩種方式:
1。調(diào)用System類的gc()靜態(tài)方法: System.gc()
2.調(diào)用Runtime的gc()實(shí)例方法:Runtime.getRuntime().gc()。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注