日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Object的finalize方法

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Object的finalize方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、一次標記

首先finalize方法是在垃圾回收時,用于確認該對象是否確認被回收的一個標記過程。

確認一個對象真正被回收需要經歷兩次標記過程:

  • 可達性分析沒有引用,這是第一次標記
    是否有必要執行finalize方法,如果對象沒有重寫finalize方法或者finalize方法已經被調用過了,那么finalize方法就是沒有必要執行的,沒有必要執行finalize方法的對象就會被直接回收。如果對象被判定為有必要執行finalize()方法,那么這個對象將會放置在一個叫做F-Queue的隊列之中,并在稍后由一個由虛擬機創建、低優先級的finalizer線程去執行它。這里所謂的“執行”是指虛擬機會觸發這個方法,但并不承諾會等待它運行結束,這樣做的原因是,如果一個對象的finalize()執行緩慢,極端情況下死循環,那么就會導致F-Queue隊列中其他對象永久處于等待,甚至導致整個內存回收系統崩潰。

  • finalize()方法是對象逃脫死亡命運的最后一次機會,稍后GC將對F-Queue中的對象進行第二次小規模的標記,如果對象要在finalize()成功拯救自己——只需要重新與引用鏈上的任何一個對象建立關聯即可,譬如把this關鍵字賦值給某個類的變量或者對象的成員變量,那么第二次標記時它將會被移出“即將回收”的集合;如果對象這時還沒有逃脫,那么它就真正被回收了。

/*** Finalizer方法逃避GC* 但是只能逃避一次* create by chenxichao*/ public class FinalizerEscapeGc {public static FinalizerEscapeGc SAVE_HOOK = null;public void isAlive(){System.out.println("yes i am still alive :)");}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method execute");FinalizerEscapeGc.SAVE_HOOK = this;}public static void main(String[] args) throws Exception{SAVE_HOOK = new FinalizerEscapeGc();//對象第一次成功拯救自己SAVE_HOOK = null;System.gc();//因為finalize方法的優先級很低,所以睡一下Thread.sleep(500);if(SAVE_HOOK != null){SAVE_HOOK.isAlive();}else{System.out.println("no i am dead");}//第二次自救失敗SAVE_HOOK = null;System.gc();//因為finalize方法的優先級很低,所以睡一下Thread.sleep(500);if(SAVE_HOOK != null){SAVE_HOOK.isAlive();}else{System.out.println("no i am dead");}} }

二、 總結

  • finalize方法不是一定會執行,只有在該方法被重寫的時候才會執行 f
  • inalize方法只會被執行一次
  • 對象可以在finalize方法中獲得自救,避免自己被垃圾回收,同樣自救也只能一次
  • 不推薦Java程序員調用該方法,因為finalize方法代價很大

總結

以上是生活随笔為你收集整理的Object的finalize方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。