Java中finalize()方法的作用
阿新 • • 發佈:2020-11-30
finalize方法是Object提供的的例項方法,使用規則如下:
- 當物件不再被任何物件引用時,GC會呼叫該物件的finalize()方法
- finalize()是Object的方法,子類可以覆蓋這個方法來做一些系統資源的釋放或者資料的清理
- 可以在finalize()讓這個物件再次被引用,避免被GC回收;但是最常用的目的還是做cleanup
- Java不保證這個finalize()一定被執行;但是保證呼叫finalize的執行緒沒有持有任何user-visible同步鎖。
- 在finalize裡面丟擲的異常會被忽略,同時方法終止。
- 當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獲得物件,而且建立虛引用必須要有關聯佇列,當物件被回收之後,虛引用會被放入關聯佇列中,所以我們可以通過觀察關聯佇列來判斷物件是否被回收。
在看終結器引用時講到這裡,感覺有點不清楚,故特意查文章再鞏固確認。
原文連結:finalize()方法的作用