最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java禁止使用finalize方法

 更新時(shí)間:2017年10月13日 11:30:07   投稿:mrr  
這篇文章主要介紹了Java禁止使用finalize方法,需要的朋友可以參考下

什么是finalize方法

finalize()方法被定義在Java.lang.Object類中,意味著所有的類都可以重載這個(gè)方法。java垃圾回收器只之道釋放那些經(jīng)由new分配的內(nèi)存,所以如果你的對象并非通過new獲得的內(nèi)存,那么垃圾回收器就不知道如何釋放該對象的內(nèi)存了。

為了應(yīng)對這種情況,java允許在類中重載java.lang.Object類中的finalize()方法。

它的工作原理:一旦垃圾回收器準(zhǔn)備好釋放對象占用的存儲(chǔ)空間,將首先調(diào)用其finalize()方法,并且在下一次垃圾回收動(dòng)作發(fā)生時(shí),才會(huì)真正回收對象占用的內(nèi)存。

finalize函數(shù)的調(diào)用機(jī)制

java虛擬機(jī)規(guī)范并沒有硬性規(guī)定垃圾回收該不該搞,以及該如何搞。所以這里提到的調(diào)用機(jī)制不能保證適合所有jvm。

何時(shí)被調(diào)用?

  finalize啥時(shí)候才會(huì)被調(diào)用捏?一般來說,要等到JVM開始進(jìn)行垃圾回收的時(shí)候,它才有可能被調(diào)用。而JVM進(jìn)行垃圾回收的時(shí)間點(diǎn)是非常不確定的,依賴于各種運(yùn)行時(shí)的環(huán)境因素。正是由于finalize函數(shù)調(diào)用時(shí)間點(diǎn)的不確定,導(dǎo)致了后面提到的某些缺點(diǎn)。

誰來調(diào)用?

  常見的JVM會(huì)通過GC的垃圾回收線程來進(jìn)行finalize函數(shù)的調(diào)用。由于垃圾回收線程比較重要(人家好歹也是JVM的一個(gè)組成部分嘛),為了防止finalize函數(shù)拋出的異常影響到垃圾回收線程的運(yùn)作,垃圾回收線程會(huì)在調(diào)用每一個(gè)finalize函數(shù)時(shí)進(jìn)行try catch,如果捕獲到異常,就直接丟棄,然后接著處理下一個(gè)失效對象的finalize函數(shù)。

為什么禁止使用finalize()

1.調(diào)用時(shí)間不確定---有資源浪費(fèi)的風(fēng)險(xiǎn)

前面已經(jīng)介紹了調(diào)用機(jī)制。同學(xué)們應(yīng)該認(rèn)清“finalize的調(diào)用時(shí)機(jī)是很不確定的”這樣一個(gè)事實(shí)。所以,假如你把某些稀缺資源放到finalize()中釋放,可能會(huì)導(dǎo)致該稀缺資源等上很久很久很久以后才被釋放。這可是資源的浪費(fèi)啊!另外,某些類對象所攜帶的資源(比如某些JDBC的類)可能本身就很耗費(fèi)內(nèi)存,這些資源的延遲釋放會(huì)造成很大的性能問題。

2.可能不被調(diào)用----有資源泄露的風(fēng)險(xiǎn)

很多同學(xué)以為finalize()總是會(huì)被調(diào)用,其實(shí)不然。在某些情況下,finalize()壓根兒不被調(diào)用。比如在JVM退出的當(dāng)口,內(nèi)存中那些對象的finalize函數(shù)可能就不會(huì)被調(diào)用了。

估計(jì)有同學(xué)在打“runFinalizersOnExit”的主意,來確保所有的finalize在JVM退出前被調(diào)用。很可惜也很遺憾,該方法從JDK 1.2開始,就已經(jīng)被廢棄了。即使該方法不被廢棄,也是有很大的線程安全隱患滴!   

從上述可以看出,一旦你依賴finalize()來幫你釋放資源,那可是很不妙?。ㄓ匈Y源泄漏的危險(xiǎn))!很多時(shí)候,資源泄露導(dǎo)致的性能問題更加嚴(yán)重,萬萬不可小看。

3.對象可能在finalize函數(shù)調(diào)用時(shí)復(fù)活

本來,只有當(dāng)某個(gè)對象已經(jīng)失效(沒有引用),垃圾回收器才會(huì)調(diào)用該對象的finalize函數(shù)。但是,萬一碰上某個(gè)變態(tài)的程序員,在finalize()函數(shù)內(nèi)部再把對象自身的引用(也就是this)重新保存在某處,也就相當(dāng)于把自己復(fù)活了(因?yàn)檫@個(gè)對象重新有了引用,不再處于失效狀態(tài))。 為了防止發(fā)生這種詭異的事情,垃圾回收器只能在每次調(diào)用完finalize()之后再次去檢查該對象是否還處于失效狀態(tài)。這無形中又增加了JVM的開銷。隨便提一下。由于JDK的文檔中規(guī)定了,JVM對于每一個(gè)類對象實(shí)例最多只會(huì)調(diào)用一次finalize()。所以,對于那些詐尸的實(shí)例,當(dāng)它們真正死亡時(shí),finalize()反而不會(huì)被調(diào)用了。這看起來是不是很奇怪?

4.要記得自己做異常捕獲

剛才在介紹finalize()調(diào)用機(jī)制時(shí)提到,一旦有異常拋出到finalize函數(shù)外面,會(huì)被垃圾回收線程捕獲并丟棄。也就是說,異常被忽略掉了(異常被忽略的危害,“這里”有提到)。為了防止這種事兒,凡是finalize()中有可能拋出異常的代碼,你都得寫上try catch語句,自己進(jìn)行捕獲。

5.小心線程安全

由于調(diào)用finalize()的是垃圾回收線程,和你自己代碼的線程不是同一個(gè)線程;甚至不同對象的finalize()可能會(huì)被不同的垃圾回收線程調(diào)用(比如使用“并行收集器”的時(shí)候)。所以,當(dāng)你在finalize()里面訪問某些數(shù)據(jù)的時(shí)候,還得時(shí)刻留心線程安全的問題。

總結(jié)

以上所述是小編給大家介紹的Java禁止使用finalize方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Opencv創(chuàng)建車牌圖片識別系統(tǒng)方法詳解

    Opencv創(chuàng)建車牌圖片識別系統(tǒng)方法詳解

    本文主要介紹了一個(gè)基于spring?boot+maven+opencv實(shí)現(xiàn)的圖像識別及訓(xùn)練項(xiàng)目,可以實(shí)現(xiàn)車牌識別功能,感興趣的可以跟隨小編一起試一試
    2022-01-01
  • SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié)

    SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié)

    這篇文章主要介紹了SpringBoot 中實(shí)現(xiàn)跨域的5種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

    Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)

    這篇文章主要介紹了Spring-Validation 后端數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Java如何實(shí)現(xiàn)基于Redis的分布式鎖

    詳解Java如何實(shí)現(xiàn)基于Redis的分布式鎖

    在不同進(jìn)程需要互斥地訪問共享資源時(shí),分布式鎖是一種非常有用的技術(shù)手段。這篇文章運(yùn)用圖文和實(shí)例代碼介紹了Java如何實(shí)現(xiàn)基于Redis的分布式鎖,文章介紹的很詳細(xì),對Java和Redis剛興趣的朋友們可以參考借鑒,下面來一起看看。
    2016-08-08
  • 關(guān)于spring boot整合kafka+注解方式

    關(guān)于spring boot整合kafka+注解方式

    這篇文章主要介紹了關(guān)于spring boot整合kafka+注解方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 一文詳解MVCC的執(zhí)行原理

    一文詳解MVCC的執(zhí)行原理

    MVCC是一種并發(fā)控制機(jī)制,用于解決數(shù)據(jù)庫并發(fā)訪問中,數(shù)據(jù)一致性問題,它通過在讀寫操作期間保存多個(gè)數(shù)據(jù)版本,以提供并發(fā)事務(wù)間的隔離性,本文將和大家簡單聊聊MVCC的執(zhí)行原理,需要的朋友可以參考下
    2023-12-12
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(共享模式)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解

    java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解

    這篇文章主要介紹了java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的操作方法

    SpringBoot整合Docker實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行的操作方法

    本文講解的是 SpringBoot 引入容器化技術(shù) Docker 實(shí)現(xiàn)一次構(gòu)建到處運(yùn)行,包括鏡像構(gòu)建、Docker倉庫搭建使用、Docker倉庫可視化UI等內(nèi)容,需要的朋友可以參考下
    2022-10-10
  • 深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    這篇文章主要為大家詳細(xì)介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06

最新評論

丰台区| 高密市| 镇康县| 林甸县| 定结县| 额尔古纳市| 定州市| 柏乡县| 河西区| 巴里| 孝义市| 赞皇县| 屯留县| 新和县| 武胜县| 湘潭县| 依兰县| 仙游县| 沙田区| 安西县| 新蔡县| 大同市| 德庆县| 祁东县| 山西省| 兴仁县| 磴口县| 潮州市| 平定县| 灵宝市| 中卫市| 新宁县| 焉耆| 阿图什市| 沛县| 舟曲县| 南溪县| 大连市| 大田县| 安义县| 双牌县|