[英]Can you count on .finalize() to be called?
我試圖檢測我的一些Java代碼以確保對象被正確地進行垃圾收集,並且我發現令人驚訝的是它並沒有像我預期的那樣經常被調用。
我現在想知道這是因為錯誤的儀器還是我需要解決的實際內存泄漏。 VisualVM分析器似乎表明了前者。
令人擔憂的情況是我有一個處理請求的線程,並且在請求中創建了數千個臨時對象。 有時,此線程寫入的套接字意外關閉,線程遇到異常並死亡。
當線程死亡時,似乎不會在這些對象上調用.finalize()。 這是不相信我的儀器的原因嗎?
Finalize()不是解決方案。 您無法知道何時會調用終結器。 如果您的問題是異常,請使用try/catch/finally
塊並關閉/清除您要在finally塊中關閉的所有內容。 這保證了在兩種情況下都會清理所有內容:邏輯正常終止或拋出異常。
根據我的所有關於Java基礎讀你不應該依靠最后確定運行。 finalize() 不是你可能從其他語言中知道的析構函數 。
來自java.lang.Object javadoc:
The Java programming language does not guarantee which thread will invoke the finalize method for any given object.
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize ()
我看待事物的方式,可怕的終結應該只在您的應用程序中包含一些本機代碼時使用。 但即使這樣,也要確保不要依賴它。
您的困惑似乎是內存泄漏是否存在。 您正試圖通過查看是否調用finalize()
來建立此功能。 如果是這樣那么檢查是否存在內存泄漏是不正確的。
我們很清楚,在Java中, 內存泄漏主要是指對您不需要的對象的隱藏引用。
finalize()
目的是讓開發人員有機會清理自己的混亂(連接,流,......)。 內存應該是JVM的混亂/頭痛,並由GC清理。
簡而言之,事實上“ GC保證在調用finalize()
之前釋放內存 ”,不應該被解釋為“ 如果沒有調用finalize()
則存在內存泄漏 ”。 可能只是該對象尚未被垃圾收集。
如果您正在尋找內存泄漏,請使用工具。 見選項:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.