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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java终结器_Java的终结器仍然存在

發布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java终结器_Java的终结器仍然存在 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java終結器

當我第一次學習Java并從C ++過渡到Java時,我記得我經常被告知,經常讀到它不應該像C ++析構函數那樣對待Java終結器,也不應該依靠它。 該建議的頻率和堅持性對我產生了影響,以至于我無法回憶起我上一次編寫finalize()方法的經歷,也無法回憶起我在編寫,閱讀,審閱,維護,修改和調試的Java代碼。 但是直到最近,我還沒有考慮finalize()的影響 ,可能是因為我沒有使用finalize() 。 最近對finalize()的經驗已將Java終結器的效果從“學術練習”轉變為“野外”的真實問題。

Object.finalize()的方法級Javadoc文檔注釋提供了有關Java終結器的一些有趣的細節。 首先提供對方法的總體描述,“當垃圾回收確定不再有對該對象的引用時,垃圾回收器將其調用在對象上。 子類會覆蓋finalize方法來處置系統資源或執行其他清理。” 該Javadoc注釋的另一部分警告了與Java終結器的使用通常相關的幾個問題 :“ Java編程語言不能保證哪個線程將為任何給定對象調用finalize方法。 但是,可以保證,調用finalize的線程在調用finalize時不會持有任何用戶可見的同步鎖。 如果finalize方法引發了未捕獲的異常,則該異常將被忽略,并且該對象的終結將終止。”

喬什·布洛赫(Josh Bloch)在《 有效的Java》中專門介紹了Java終結器這一主題。 Effective Java第二版的第7項標題簡潔明了,“避免終結器”。 盡管有效Java中的許多項目都使用了動詞,例如“ Prefer”或“ Consider”,但該項目使用了更強的動詞“ Avoid”。 布洛赫(Bloch)確實列舉了一些可能使用終結器的示例,但是他對仍然存在的內在問題的描述以及為減輕這些問題而需要考慮的許多事情,使我們大多數人都盡量避免使用它們。

Bloch以強調的( 粗體 )語句開始了有效的Java項目“ Avoid Finalizers”,“ Finalizers是不可預測的,通常是危險的,并且通常是不必要的。 “ Bloch強調開發人員不應“ 在終結器中做任何對時間要求嚴格的事情 ”,因為“不能保證[Java終結器將被立即執行”,并且他強調開發人員應“ 永遠不要依賴終結器來更新關鍵的持久狀態 ”。因為“根本無法保證[Java終結器]將被執行。” Bloch引用了終結器中的異常不會被捕獲,并警告了這樣做的危險,因為“未捕獲的異常可能會使對象處于損壞狀態。”

Bloch還描述了我最近使用過的Java終結器的負面影響。 他的“避免終結器”項強調(以粗體顯示 ),“ 使用終結器會導致嚴重的性能損失 ”,因為“ 使用終結器創建和銷毀對象”會花費更長的時間。 在我們的例子中,我們使用的是第三方庫,該庫在內部使用Java類finalize()方法來釋放本機內存(C / C ++通過JNI )。 因為這些類中有很多這些對象帶有finalize()方法,所以似乎處理Java終結的系統線程落后了,并且鎖定了正在終結的對象。

垃圾收集也受到了不利影響 ,因為收集者啟動的頻率比我們通常看到的還要頻繁。 我們很快意識到垃圾收集日志表明垃圾收集問題,這些問題很難追溯到典型的堆大小問題或我們自己類的內存泄漏 。 使用jcmd <pid> GC.class_histogram GC.class_histogram對JVM進程運行非常有用的jcmd ,有助于我們快速了解潛在的罪魁禍首。 該類直方圖顯示了足夠的java.lang.ref.Finalizer實例,以確保它在頂部排名第三。 由于該課程通常在課程直方圖的下方,因此我什至通常不會看到或考慮它。 當我們意識到在類直方圖中描述的前八個實例中的另外三個是第三方庫中的三個類,并且它們實現了finalize()方法時,我們就能夠解釋行為并將其歸咎于終結器 (四個直方圖中排名前八位的類別中,這是一個相當安全的指責)。

Java語言規范在第12.6節 (“類實例的完成”)中提供了一些與Java終結器相關的細節。 本節從描述Java終結器開始:“可以為對象調用的finalize()的特定定義稱為該對象的終結器。 在垃圾回收器回收對象的存儲之前,Java虛擬機將調用該對象的終結器。” 這里引用了Java語言規范這一節中描述的Java終結器的一些有意不確定的特征(我已經加了任何強調 ):

  • “Java編程語言沒有規定如何盡快終結將被調用。”
  • “ Java編程語言沒有指定哪個線程將為任何給定對象調用終結器。”
  • “終結器可以按任何順序調用,甚至可以同時調用。”
  • “如果在完成過程中拋出未捕獲的異常 ,則該異常將被忽略,并且該對象的完成將終止。”

我發現自己很喜歡與解決此問題的團隊一起工作,因為我能夠在“現實生活”中體驗我只是從“學術”意義上閱讀和了解的內容。 應用最喜歡的工具(例如jcmd )并應用以前的經驗(例如識別出jcmd 類直方圖中看起來不合適的東西 )來解決一個新問題總是很令人滿意的。

翻譯自: https://www.javacodegeeks.com/2017/03/javas-finalizer-still.html

java終結器

總結

以上是生活随笔為你收集整理的java终结器_Java的终结器仍然存在的全部內容,希望文章能夠幫你解決所遇到的問題。

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