簡體   English   中英

你能指望.finalize()被調用嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM