當程序創(chuàng)建對象,數(shù)組等引用類型的實體時,系統(tǒng)會在堆內(nèi)存中為之分配一塊內(nèi)存區(qū),對象就保存在這塊內(nèi)存區(qū)里面,當這塊內(nèi)存不再被任何引用類型變量引用時,這塊內(nèi)存就成了垃圾,等待垃圾回收機制進行回收.
- 1.垃圾回收機制只會回收堆內(nèi)存中的資源,不會回收任何的物理資源(比如數(shù)據(jù)庫連接,網(wǎng)絡(luò)IO等資源)
- 2.程序無法精確的控制垃圾回收的運行,垃圾回收會在合適的時候執(zhí)行.
- 3.在垃圾回收機制回收任何對象之前,總會調(diào)用它的
finalize()方法,該方法可能使該對象重新復(fù)活(讓一個引用變量重新引用該對象),從而導(dǎo)致垃圾回收機制取消回收.
可達狀態(tài):
可恢復(fù)狀態(tài):
不可達狀態(tài):

當某個對象被其他類的類變量所引用時,只有該類被銷毀后,該對象才進入可恢復(fù)狀態(tài);當某個對象被一個對象的實例變量所引用,只有當該對象被銷毀后,該對象才會進入可恢復(fù)狀態(tài).
強制垃圾回收
程序只能控制一個對象何時不再被任何引用變量引用,決不能控制它何時被回收.
程序無法精確的控制java回收的時機,但依然可以控制系統(tǒng)進行垃圾回收-----這種強制只是通知系統(tǒng)進行垃圾回收,但系統(tǒng)什么時候進行垃圾回收依然不確定.
強制系統(tǒng)進行垃圾回收的兩種方式:
- 1.調(diào)用
System類的gc()靜態(tài)方法:System.gc() - 2.調(diào)用
Runtime對象的gc()實例方法:Runtime.getRuntime().gc().
這種強制只是建議系統(tǒng)立即進行垃圾回收,系統(tǒng)完全有可能不立即進行垃圾回收,垃圾回收機制也不會對程序的建議完全置之不理:垃圾回收機制會在收到通知之后,盡快進行垃圾回收.
只有當程序認為需要更多的額外內(nèi)存時,垃圾回收機制才會進行垃圾回收.即如果某個失去引用的對象只占用了少量的內(nèi)存,而且系統(tǒng)沒有產(chǎn)生嚴重的內(nèi)存需求,因此垃圾回收機制并沒有試圖回收該對象所占用的資源,所以該對象的finalize()方法也不會得到調(diào)用.
finalize()方法的四個特點:
- 1永遠不要主動調(diào)用某個對象的finalize()方法,該方法應(yīng)該交給垃圾回收機制調(diào)用
- 2
finalize()方法何時被調(diào)用,是否被調(diào)用具有不確定性,不要把finalize()方法當成一定會被執(zhí)行的方法 - 3當
JVM執(zhí)行可恢復(fù)對象的finalize()方法時,可能使對象或系統(tǒng)中其他對象重新變成可達狀態(tài) - 4當
JVM執(zhí)行finalize()方法時出現(xiàn)異常時,垃圾回收機制不會報告異常,程序繼續(xù)進行.
由于finalize()方法不一定會被執(zhí)行,因此如果想要清理某個類里打開的資源,則不要放在finalize()方法中進行清理.
java中對象的4種引用方式
強引用:程序創(chuàng)建一個對象,并把這個對象賦值給一個引用變量,程序通過該引用變量來操作實際的對象.
軟引用:
弱引用
虛引用