91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java對finalize方法實現禁止

發布時間:2020-12-08 16:24:50 來源:億速云 閱讀:164 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關怎么在Java對finalize方法實現禁止,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么是finalize方法

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

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

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

finalize函數的調用機制

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

何時被調用?

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

誰來調用?

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

為什么禁止使用finalize()

1.調用時間不確定---有資源浪費的風險

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

2.可能不被調用----有資源泄露的風險

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

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

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

3.對象可能在finalize函數調用時復活

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

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

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

5.小心線程安全

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

關于怎么在Java對finalize方法實現禁止就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长垣县| 石林| 手游| 保靖县| 和平县| 南部县| 大冶市| 健康| 永川市| 武陟县| 额尔古纳市| 南雄市| 诸城市| 金坛市| 历史| 固始县| 阿尔山市| 施秉县| 武城县| 岳池县| 且末县| 邢台县| 东至县| 阜阳市| 咸宁市| 宁津县| 收藏| 江津市| 上栗县| 泰来县| 专栏| 苍溪县| 怀远县| 台北县| 雅江县| 平顶山市| 宁蒗| 雅安市| 竹北市| 阳城县| 辰溪县|