當finalize()
拋出異常的時候會被忽略。並且,對象的終結將在此中止,致使對象處在一種不肯定的狀態。若是另外一個進程試圖使用這個對象的話,將產生不肯定的結果。一般拋出異常將會致使線程終止併產生一個提示信息,可是從finalize()
中拋出異常就不會。java
我想實踐一下finalize()
方法,能提供一個範例嗎?數組
class LargeObject { byte[] memory = new byte[1024*1024*4]; @Override protected void finalize() throws Exception { System.out.println("finalized"); } } public class FinalizeDemo { public static void main(String[] args) { while (true) new LargeObject(); } }
finalize()
代碼清單1中的代碼寫了一個FinalizeDemo
程序,重複地對largeObject
類實例化。每個Largeobject
對象將產生4M的數組。在這種狀況下,因爲沒有指向該對象的引用,因此LargeObject
對象將被GC回收。ide
GC會調用對象的finalize()
方法來回收對象。LargeObject
重載的finalize()
方法被調用的時候會想標準輸出流打印一條信息。它沒有調用父類的finalize()
方法,由於它的父類是Object
,即父類的finalize()
方法什麼也不作。spa
編譯(javac FinalizeDemo.java
)並運行(java FinalizeDemo
)代碼清單1.當我在個人環境下(64位win7平臺)使用JDK7u6來編譯運行的時候,我看到一列finalized
的信息。可是在JDK8的環境下時,在幾行finalized
以後拋出了java.lang.OutOfMemoryError
。線程
由於
finalize()
方法對於虛擬機來講不是輕量級的程序,因此不能保證你必定會在你的環境下觀察到輸出信息。code