1. 程式人生 > >java——finalize 方法

java——finalize 方法

垃圾回收器準備釋放記憶體的時候,會先呼叫finalize()。

  • 物件不一定會被回收。
  • 垃圾回收不是解構函式。
  • 垃圾回收只與記憶體有關。
  • 垃圾回收和 finalize() 都是靠不住的,只要JVM還沒有快到耗盡記憶體的地步,它是不會浪費時間進行垃圾回收的。

有時當撤消一個物件時,需要完成一些操作。例如,如果一個物件正在處理的是非Java 資源,如檔案控制代碼或window 字元字型,這時你要確認在一個物件被撤消以前要保證這些資源被釋放。為處理這樣的狀況,Java 提供了被稱為收尾(finalization )的機制。使用該機制你可以定義一些特殊的操作,這些操作在一個物件將要被垃圾回收程式釋放時執行。

要給一個類增加收尾(finalizer ),你只要定義finalize ( ) 方法即可。Java 回收該類的一個物件時,就會呼叫這個方法。在finalize ( )方法中,你要指定在一個物件被撤消前必須執行的操作。垃圾回收週期性地執行,檢查物件不再被執行狀態引用或間接地通過其他物件引用。就在物件被釋放之前,Java 執行系統呼叫該物件的finalize( ) 方法。

finalize()方法的通用格式如下:

protected void finalize( )
{
    // finalization code 
}

其中,關鍵字protected是防止在該類之外定義的程式碼訪問finalize()識別符號。

在 Java 中,當你建立一個物件時,Java 虛擬機器(JVM)為該物件分配記憶體、呼叫建構函式並開始跟蹤你使用的物件。當你停止使用一個物件(就是說,當沒有對該物件有效的引用時),JVM 通過垃圾回收器將該物件標記為釋放狀態。

當垃圾回收器將要釋放一個物件的記憶體時,它呼叫該物件的finalize() 方法(如果該物件定義了此方法)。垃圾回收器以獨立的低優先順序的方式執行,只有當其他執行緒掛起等待該記憶體釋放的情況出現時,它才開始執行釋放物件的記憶體。(事實上,你可以呼叫System.gc() 方法強制垃圾回收器來釋放這些物件的記憶體。)

如果你為某個物件定義了finalize() 方法,JVM 可能不會呼叫它,因為垃圾回收器不曾釋放過那些物件的記憶體。呼叫System.gc() 也不會起作用,因為它僅僅是給 JVM 一個建議而不是命令。

Gc() 才是垃圾回收器

package com.zth;

class Demo{
  public void finalize() {
    System.out.println("呼叫 finalize() 方法...");
  }
}

public class Test{
  public static void main(String[] args) {
    Demo f = new Demo();
    Demo f1 = new Demo();
    Demo f2 = new Demo();
    f = null;
    f1 = null;
    f2 = null;
    System.gc();
  }
}

執行結果:

呼叫 finalize() 方法...
呼叫 finalize() 方法...
呼叫 finalize() 方法...