1. 程式人生 > >Java中finalize()方法的作用

Java中finalize()方法的作用

finalize方法是Object提供的的例項方法,使用規則如下:

  1. 當物件不再被任何物件引用時,GC會呼叫該物件的finalize()方法
  2. finalize()是Object的方法,子類可以覆蓋這個方法來做一些系統資源的釋放或者資料的清理
  3. 可以在finalize()讓這個物件再次被引用,避免被GC回收;但是最常用的目的還是做cleanup
  4. Java不保證這個finalize()一定被執行;但是保證呼叫finalize的執行緒沒有持有任何user-visible同步鎖。
  5. 在finalize裡面丟擲的異常會被忽略,同時方法終止。
  6. 當finalize被呼叫之後,JVM會再一次檢測這個物件是否能被存活的執行緒訪問得到,如果不是,則清除該物件。也就是finalize只能被呼叫一次;也就是說,覆蓋了finalize方法的物件需要經過兩個GC週期才能被清除。

例子:

//FileInputStream.java
protected void finalize() throws IOException {
        if (guard != null) {
            guard.warnIfOpen();
        }

        if ((fd != null) &&  (fd != FileDescriptor.in)) {
            close();
        }
    }

在finalize裡面做資源釋放的操作。

有一種觀點是,如果使用finalize僅僅是為了觀察物件被回收,這時候我們可以用虛引用(PhantomReference)來代替,虛引用無法通過get獲得物件,而且建立虛引用必須要有關聯佇列,當物件被回收之後,虛引用會被放入關聯佇列中,所以我們可以通過觀察關聯佇列來判斷物件是否被回收。