當(dāng)程序創(chuàng)建對(duì)象,數(shù)組等引用類型的實(shí)體時(shí),系統(tǒng)會(huì)在堆內(nèi)存中為之分配一塊內(nèi)存區(qū),對(duì)象就保存在這塊內(nèi)存區(qū)里面,當(dāng)這塊內(nèi)存不再被任何引用類型變量引用時(shí),這塊內(nèi)存就成了垃圾,等待垃圾回收機(jī)制進(jìn)行回收.
- 1.垃圾回收機(jī)制只會(huì)回收堆內(nèi)存中的資源,不會(huì)回收任何的物理資源(比如數(shù)據(jù)庫連接,網(wǎng)絡(luò)IO等資源)
- 2.程序無法精確的控制垃圾回收的運(yùn)行,垃圾回收會(huì)在合適的時(shí)候執(zhí)行.
- 3.在垃圾回收機(jī)制回收任何對(duì)象之前,總會(huì)調(diào)用它的
finalize()
方法,該方法可能使該對(duì)象重新復(fù)活(讓一個(gè)引用變量重新引用該對(duì)象),從而導(dǎo)致垃圾回收機(jī)制取消回收.
可達(dá)狀態(tài):
可恢復(fù)狀態(tài):
不可達(dá)狀態(tài):
當(dāng)某個(gè)對(duì)象被其他類的類變量所引用時(shí),只有該類被銷毀后,該對(duì)象才進(jìn)入可恢復(fù)狀態(tài);當(dāng)某個(gè)對(duì)象被一個(gè)對(duì)象的實(shí)例變量所引用,只有當(dāng)該對(duì)象被銷毀后,該對(duì)象才會(huì)進(jìn)入可恢復(fù)狀態(tài).
強(qiáng)制垃圾回收
程序只能控制一個(gè)對(duì)象何時(shí)不再被任何引用變量引用,決不能控制它何時(shí)被回收.
程序無法精確的控制java回收的時(shí)機(jī),但依然可以控制系統(tǒng)進(jìn)行垃圾回收-----這種強(qiáng)制只是通知系統(tǒng)進(jìn)行垃圾回收,但系統(tǒng)什么時(shí)候進(jìn)行垃圾回收依然不確定.
強(qiáng)制系統(tǒng)進(jìn)行垃圾回收的兩種方式:
- 1.調(diào)用
System
類的gc()
靜態(tài)方法:System.gc()
- 2.調(diào)用
Runtime
對(duì)象的gc()
實(shí)例方法:Runtime.getRuntime().gc()
.
這種強(qiáng)制只是建議系統(tǒng)立即進(jìn)行垃圾回收,系統(tǒng)完全有可能不立即進(jìn)行垃圾回收,垃圾回收機(jī)制也不會(huì)對(duì)程序的建議完全置之不理:垃圾回收機(jī)制會(huì)在收到通知之后,盡快進(jìn)行垃圾回收.
只有當(dāng)程序認(rèn)為需要更多的額外內(nèi)存時(shí),垃圾回收機(jī)制才會(huì)進(jìn)行垃圾回收.即如果某個(gè)失去引用的對(duì)象只占用了少量的內(nèi)存,而且系統(tǒng)沒有產(chǎn)生嚴(yán)重的內(nèi)存需求,因此垃圾回收機(jī)制并沒有試圖回收該對(duì)象所占用的資源,所以該對(duì)象的finalize()
方法也不會(huì)得到調(diào)用.
finalize()
方法的四個(gè)特點(diǎn):
- 1永遠(yuǎn)不要主動(dòng)調(diào)用某個(gè)對(duì)象的finalize()方法,該方法應(yīng)該交給垃圾回收機(jī)制調(diào)用
- 2
finalize()
方法何時(shí)被調(diào)用,是否被調(diào)用具有不確定性,不要把finalize()
方法當(dāng)成一定會(huì)被執(zhí)行的方法 - 3當(dāng)
JVM
執(zhí)行可恢復(fù)對(duì)象的finalize()
方法時(shí),可能使對(duì)象或系統(tǒng)中其他對(duì)象重新變成可達(dá)狀態(tài) - 4當(dāng)
JVM
執(zhí)行finalize()
方法時(shí)出現(xiàn)異常時(shí),垃圾回收機(jī)制不會(huì)報(bào)告異常,程序繼續(xù)進(jìn)行.
由于finalize()
方法不一定會(huì)被執(zhí)行,因此如果想要清理某個(gè)類里打開的資源,則不要放在finalize()
方法中進(jìn)行清理.
java
中對(duì)象的4種引用方式
強(qiáng)引用:程序創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象賦值給一個(gè)引用變量,程序通過該引用變量來操作實(shí)際的對(duì)象.
軟引用:
弱引用
虛引用