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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解java的finalize

發(fā)布時(shí)間:2023/12/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解java的finalize 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄?

基本預(yù)備相關(guān)知識?
對象的銷毀過程?
對象重生的例子?
對象的finalize的執(zhí)行順序?
何時(shí)及如何使用finalize?
參考?

基本預(yù)備相關(guān)知識?

1?java的GC只負(fù)責(zé)內(nèi)存相關(guān)的清理,所有其它資源的清理必須由程序員手工完成。要不然會引起資源泄露,有可能導(dǎo)致程序崩潰。?

2 調(diào)用GC并不保證GC實(shí)際執(zhí)行。?

3 finalize拋出的未捕獲異常只會導(dǎo)致該對象的finalize執(zhí)行退出。?

4 用戶可以自己調(diào)用對象的finalize方法,但是這種調(diào)用是正常的方法調(diào)用,和對象的銷毀過程無關(guān)。?

5 JVM保證在一個(gè)對象所占用的內(nèi)存被回收之前,如果它實(shí)現(xiàn)了finalize方法,則該方法一定會被調(diào)用。Object的默認(rèn)finalize什么都不做,為了效率,GC可以認(rèn)為一個(gè)什么都不做的finalize不存在。?

6 對象的finalize調(diào)用鏈和clone調(diào)用鏈一樣,必須手工構(gòu)造。?
如?

Java代碼??

  • protected?void?finalize()?throws?Throwable?{??
  • ????super.finalize();??
  • }??



  • 對象的銷毀過程?

    在對象的銷毀過程中,按照對象的finalize的執(zhí)行情況,可以分為以下幾種,系統(tǒng)會記錄對象的對應(yīng)狀態(tài):?
    unfinalized 沒有執(zhí)行finalize,系統(tǒng)也不準(zhǔn)備執(zhí)行。?
    finalizable 可以執(zhí)行finalize了,系統(tǒng)會在隨后的某個(gè)時(shí)間執(zhí)行finalize。?
    finalized 該對象的finalize已經(jīng)被執(zhí)行了。?

    GC怎么來保持對finalizable的對象的追蹤呢。GC有一個(gè)Queue,叫做F-Queue,所有對象在變?yōu)閒inalizable的時(shí)候會加入到該Queue,然后等待GC執(zhí)行它的finalize方法。?

    這時(shí)我們引入了對對象的另外一種記錄分類,系統(tǒng)可以檢查到一個(gè)對象屬于哪一種。?
    reachable 從活動的對象引用鏈可以到達(dá)的對象。包括所有線程當(dāng)前棧的局部變量,所有的靜態(tài)變量等等。?
    finalizer-reachable 除了reachable外,從F-Queue可以通過引用到達(dá)的對象。?
    unreachable 其它的對象。?

    來看看對象的狀態(tài)轉(zhuǎn)換圖。?


    好大,好暈,慢慢看。?

    1 首先,所有的對象都是從Reachable+Unfinalized走向死亡之路的。?

    2 當(dāng)從當(dāng)前活動集到對象不可達(dá)時(shí),對象可以從Reachable狀態(tài)變到F-Reachable或者Unreachable狀態(tài)。?

    3 當(dāng)對象為非Reachable+Unfinalized時(shí),GC會把它移入F-Queue,狀態(tài)變?yōu)镕-Reachable+Finalizable。?

    4 好了,關(guān)鍵的來了,任何時(shí)候,GC都可以從F-Queue中拿到一個(gè)Finalizable的對象,標(biāo)記它為Finalized,然后執(zhí)行它的finalize方法,由于該對象在這個(gè)線程中又可達(dá)了,于是該對象變成Reachable了(并且Finalized)。而finalize方法執(zhí)行時(shí),又有可能把其它的F-Reachable的對象變?yōu)橐粋€(gè)Reachable的,這個(gè)叫做對象再生。?

    5 當(dāng)一個(gè)對象在Unreachable+Unfinalized時(shí),如果該對象使用的是默認(rèn)的Object的finalize,或者雖然重寫了,但是新的實(shí)現(xiàn)什么也不干。為了性能,GC可以把該對象之間變到Reclaimed狀態(tài)直接銷毀,而不用加入到F-Queue等待GC做進(jìn)一步處理。?

    6 從狀態(tài)圖看出,不管怎么折騰,任意一個(gè)對象的finalize只至多執(zhí)行一次,一旦對象變?yōu)镕inalized,就怎么也不會在回到F-Queue去了。當(dāng)然沒有機(jī)會再執(zhí)行finalize了。?

    7 當(dāng)對象處于Unreachable+Finalized時(shí),該對象離真正的死亡不遠(yuǎn)了。GC可以安全的回收該對象的內(nèi)存了。進(jìn)入Reclaimed。?


    對象重生的例子?

    Java代碼??

  • class?C?{??
  • ????static?A?a;??
  • }??
  • ??
  • class?A?{??
  • ????B?b;??
  • ??
  • ????public?A(B?b)?{??
  • ????????this.b?=?b;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?finalize()?{??
  • ????????System.out.println("A?finalize");??
  • ????????C.a?=?this;??
  • ????}??
  • }??
  • ??
  • class?B?{??
  • ????String?name;??
  • ????int?age;??
  • ??
  • ????public?B(String?name,?int?age)?{??
  • ????????this.name?=?name;??
  • ????????this.age?=?age;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?finalize()?{??
  • ????????System.out.println("B?finalize");??
  • ????}??
  • ??
  • ????@Override??
  • ????public?String?toString()?{??
  • ????????return?name?+?"?is?"?+?age;??
  • ????}??
  • }??
  • ??
  • public?class?Main?{??
  • ????public?static?void?main(String[]?args)?throws?Exception?{??
  • ????????A?a?=?new?A(new?B("allen",?20));??
  • ????????a?=?null;??
  • ??
  • ????????System.gc();??
  • ????????Thread.sleep(5000);??
  • ????????System.out.println(C.a.b);??
  • ????}??
  • }??


  • 期待輸出?

    Java代碼??

  • A?finalize??
  • B?finalize??
  • allen?is?20??

  • 但是有可能失敗,源于GC的不確定性以及時(shí)序問題,多跑幾次應(yīng)該可以有成功的。詳細(xì)解釋見文末的參考文檔。?

    對象的finalize的執(zhí)行順序?

    所有finalizable的對象的finalize的執(zhí)行是不確定的,既不確定由哪個(gè)線程執(zhí)行,也不確定執(zhí)行的順序。?
    考慮以下情況就明白為什么了,實(shí)例a,b,c是一組相互循環(huán)引用的finalizable對象。?

    何時(shí)及如何使用finalize?

    從以上的分析得出,以下結(jié)論。?
    1 最重要的,盡量不要用finalize,太復(fù)雜了,還是讓系統(tǒng)照管比較好。可以定義其它的方法來釋放非內(nèi)存資源。?
    2 如果用,盡量簡單。?
    3 如果用,避免對象再生,這個(gè)是自己給自己找麻煩。?
    4 可以用來保護(hù)非內(nèi)存資源被釋放。即使我們定義了其它的方法來釋放非內(nèi)存資源,但是其它人未必會調(diào)用該方法來釋放。在finalize里面可以檢查一下,如果沒有釋放就釋放好了,晚釋放總比不釋放好。?
    5 即使對象的finalize已經(jīng)運(yùn)行了,不能保證該對象被銷毀。要實(shí)現(xiàn)一些保證對象徹底被銷毀時(shí)的動作,只能依賴于java.lang.ref里面的類和GC交互了。?

    參考?

    關(guān)于引用類型,GC,finalize的相互交互可以參考ReferenceQueue GC finalize Reference 測試及相關(guān)問題

    總結(jié)

    以上是生活随笔為你收集整理的深入理解java的finalize的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产一级不卡毛片 | 精品人妻一区二区三区免费看 | 精品深夜av无码一区二区老年 | 伊人中文字幕在线观看 | 久久精品999| 国产一区二区视频播放 | 亚洲av无码乱码在线观看性色 | 69精品一区二区 | 国产精品每日更新 | 一级做a爰 | 美人被强行糟蹋np各种play | 99riav国产在线观看 | 精品人人| 国产原创视频在线 | 亚洲第一在线 | 亚洲AV无码一区二区三区蜜桃 | 二区国产 | 亚洲视频五区 | 激情视频91 | 男生女生羞羞网站 | 日韩视频区 | 日本免费不卡一区二区 | 亚洲AV无码一区二区三区性 | 四虎网站最新网址 | 天天透天天操 | sm在线看| 国产免费大片 | 午夜黄色在线观看 | 日韩一级免费毛片 | 麻豆久久精品 | 中文字幕在线欧美 | 精品在线第一页 | 在线免费av片 | 青春草国产视频 | 操操操操网 | 久久午夜伦理 | 青青草成人免费 | 在线观看日韩精品 | 在线成人免费电影 | 亚洲第一精品网站 | 香港三日本三级少妇66 | 精品在线小视频 | 欧美精品欧美极品欧美激情 | 久久国产电影 | 国产福利91精品一区二区三区 | 国产xxxx视频 | xxxx在线视频 | 又色又爽又黄18网站 | 中文字幕人妻色偷偷久久 | 国产无码精品在线播放 | 国产97在线视频 | 日本免费黄色大片 | 69性影院 | 午夜精品久久久久久久99热黄桃 | 国产精品一区二区三区在线免费观看 | av色图| 成人毛片在线视频 | 岛国av片| 亚洲xx视频 | 碰碰97 | 一级黄色小视频 | 91传媒网站 | 992tv人人草| 欧美性猛交xxxx乱大交退制版 | 麻豆成人精品国产免费 | 国产第一亚洲 | www.jizzjizz| 特种兵之深入敌后 | 亚洲欧美va天堂人熟伦 | 日本大奶少妇 | 粗大黑人巨茎大战欧美成人 | 日韩免费在线 | 丰满女人又爽又紧又丰满 | 91久久国产综合久久91 | av一道本| 国产亚洲欧美视频 | 我要爱爱网 | 亚洲黄色网页 | 91在线免费看| 伊人开心网 | 国产精品看片 | 亚洲精品一区二区三区蜜桃久 | 91九色在线观看 | 精品一区在线 | 亚洲小说网 | 5566色| 男男毛片 | 中文字幕永久在线视频 | 嫩草大剧院 | 欧美大片在线免费观看 | 色女人网 | 欧美日韩一区二区在线观看 | 国产婷婷在线观看 | 麻豆av一区二区三区久久 | japanese av在线| 射精一区二区 | 成人片黄网站久久久免费 | 明里柚番号 | 四虎永久免费影院 |