欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java禁止使用finalize方法

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

什么是finalize方法

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

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

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

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

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

何時被調(diào)用?

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

誰來調(diào)用?

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

為什么禁止使用finalize()

1.調(diào)用時間不確定---有資源浪費的風險

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

2.可能不被調(diào)用----有資源泄露的風險

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

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

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

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

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

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

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

5.小心線程安全

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

總結(jié)

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

相關(guān)文章

  • SpringBoot中獲取profile的方法詳解

    SpringBoot中獲取profile的方法詳解

    這篇文章主要介紹了springboot獲取profile的操作,文中的示例代碼講解詳細,具有很好的參考價值,希望對大家有所幫助
    2022-04-04
  • Java面試題沖刺第三天--集合框架篇

    Java面試題沖刺第三天--集合框架篇

    這篇文章主要為大家分享了最有價值的三道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Maven安裝與配置圖文教程

    Maven安裝與配置圖文教程

    這篇文章主要為大家詳細介紹了Maven安裝與配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • MyBatis-Plus插件機制及通用Service新功能

    MyBatis-Plus插件機制及通用Service新功能

    這篇文章主要介紹了MyBatis-Plus插件機制以及通用Service、新功能,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • JAVA?biginteger類bigdecimal類的使用示例學習

    JAVA?biginteger類bigdecimal類的使用示例學習

    這篇文章主要為大家介紹了JAVA?biginteger類bigdecimal類的使用示例學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 詳解Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin)

    詳解Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-mav

    這篇文章主要介紹了Springboot-MyBatis配置-配置端口號與服務路徑(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java用Cookie限制點贊次數(shù)(簡版)

    Java用Cookie限制點贊次數(shù)(簡版)

    最近做了一個項目,其中有項目需求是,要用cookie實現(xiàn)限制點贊次數(shù),特此整理,把實現(xiàn)代碼分享給大家供大家學習
    2016-02-02
  • spring帶bean和config如何通過main啟動測試

    spring帶bean和config如何通過main啟動測試

    這篇文章主要介紹了spring帶bean和config,通過main啟動測試,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java開發(fā)環(huán)境配置JDK超詳細整理(適合新手入門)

    Java開發(fā)環(huán)境配置JDK超詳細整理(適合新手入門)

    這篇文章主要給大家介紹了關(guān)于Java開發(fā)環(huán)境配置JDK超詳細整理的相關(guān)資料,非常適合新手入門,JDK是Java語言的軟件開發(fā)工具包,主要用于移動設(shè)備、嵌入式設(shè)備上的java應用程序,需要的朋友可以參考下
    2023-11-11
  • java獲取日期之間天數(shù)的方法

    java獲取日期之間天數(shù)的方法

    這篇文章主要介紹了java獲取日期之間天數(shù)的方法,涉及java針對日期的轉(zhuǎn)換與數(shù)學運算相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論