若是finalize()拋出異常會怎樣?

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();
   }
}

代碼清單1:實踐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

相關文章
相關標籤/搜索