這是Stack Overflow上關于Finalizetion意義的兩段討論,這兩個觀點是互為補充的。
觀點1:
垃圾回收器(The garbage collector)自動在后臺運行(雖然它也可以被直接調用,但是一般不這么干),基本上它就是清理那些沒有被其他對象引用的對象。(垃圾回收器的整個工作原理要比上面說的復雜,但基本就是這樣)。所以它不會改變活動對象(live object)上的任何引用。如果一個對象不能被其他活動對象引用(can not be accessed),那么就意味著它可以被安全地回收。
Finalizetion主要用來釋放被對象占用的資源(不是指內存,而是指其他資源,比如文件(File Handle)、端口(ports)、數據庫連接(DB Connection)等)。然而,它不能真正有效地工作。
●finalize()的調用事件是不可預知的。
●事實上,沒有機制能保證finalize()一定會被調用。
但是即使finalize()被保證一定會被調用,它也不是一個釋放資源的好地方;當它被調用準備清理所有你打開的數據庫連接(DB Connections)時,系統可能已經耗盡了所有空閑的連接,然后你的app就不能繼續跑了。
觀點2:
一旦垃圾回收器運行(VM決定它什么時候需要清理內存,你不能強迫它運行)并決定從某個對象(this object)中回收內存時(這意味著已經沒有引用(reference)指向這個對象,至少它不是可達(reachable)的對象),在它刪除這個對象占用的內存時,它將調用對象上的finalize()方法。你可以肯定的是如果進行了垃圾回收,那么在對象消失(dispperars)前finalize()方法會被調用,但你無法確定它是否會被GC回收,所以你不能依賴這個方法做清理工作。你應該在finally{}里面做清理工作,不要使用finalize()方法,因為它不一定保證會被運行。
從以上觀點總結:GC是用來回收對象占用的內存的,而finalize()這個東西會被finalizer調用,用來回收資源(文件、端口、數據庫連接等)。
文章列表