jvm垃圾回收之finalize方法
阿新 • • 發佈:2020-12-31
垃圾回收:
- 首先進行一次引用判斷,當前資源是否有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。