1. 程式人生 > 其它 >jvm垃圾回收之finalize方法

jvm垃圾回收之finalize方法

技術標籤:垃圾回收jvmjvm.gc

垃圾回收:

  • 首先進行一次引用判斷,當前資源是否有GCroot引用,沒有引用則進行下一步
  • 檢視物件是否有必要執行finalize方法,有必要則進行下一步-----沒有必要執行finalize則直接進行gc(沒有自救的機會)
  • finalizde方法會將物件放到一個F-Queue中,等待gc回收
  • 這其中有一次物件的自救,在佇列中沒有被回收並且再一次被物件引用,此時當前物件成功進行了自救
/**
 * 垃圾回收:
 *  首先進行一次引用判斷,當前資源是否有GCroot引用,沒有引用則進行下一步
 *  檢視物件是否有必要執行finalize方法,有必要則進行下一步-----沒有必要執行finalize則直接進行gc(沒有自救的機會)
 *  finalizde方法會將物件放到一個F-Queue中,等待gc回收
 *  這其中有一次物件的自救,在佇列中沒有被回收並且再一次被物件引用,此時當前物件成功進行了自救
 */
public class FinalizeEscapeGC { public static FinalizeEscapeGC SAVE_HOOK = null; public void isAlive() { System.out.println("yes i am still alive :"); } /** * finalize方法,每個物件只執行一次 * @throws Throwable */ @Override protected void finalize() throws
Throwable { super.finalize(); System.out.println("finalize mmethod executed"); FinalizeEscapeGC.SAVE_HOOK = this; } /** * 下面是倆種情況, * 第一種情況是物件執行了finalize方法,其是有機會自救的 * 第二種情況是物件執行過finalize方法,所以第二次不會執行直接垃圾回收 * @param args * @throws Throwable */
public static void main(String[] args) throws Throwable { SAVE_HOOK = new FinalizeEscapeGC(); //物件第一次成功針拯救自己 SAVE_HOOK = null; System.gc(); //因為finalize方法優先順序很低,暫停0.5秒等待他 Thread.sleep(500); if (SAVE_HOOK!=null){ SAVE_HOOK.isAlive(); }else { System.out.println("no, i am dead :("); } //物件自救失敗 SAVE_HOOK = null; System.gc(); //因為finalize方法優先順序很低,暫停0.5秒等待他 Thread.sleep(500); if (SAVE_HOOK!=null){ SAVE_HOOK.isAlive(); }else { System.out.println("no, i am dead :("); } } }

但是現在不用finalze了,官方宣告不推薦使用,所以直接忘了它也不影響各位發揮。因為現在的try…catch能辦的更好,完全取代finalize。