2012-10-31 55 views
1

我使用jprofiler爲我的客戶端代碼檢測內存泄漏。啓動java.util.hashmap $ entry所使用的內存急劇增加至1700KB。之後它也下降了。堆轉儲顯示java.lang.ref.finalizer正在使用最大的內存。它的結論是什麼?當我嘗試在我的源代碼中查找finalize()時,它不在那裏。在HTML文件finalize()中使用像這樣。 finalize,這是什麼意思?原因是finalize()或引用hashmap $條目導致泄漏?java中的內存泄露

+0

有沒有這樣的事情'java.lang.ref.finalizer'或'$的java.util.HashMap entry'。請使用REAL類名稱或方法名稱或任何它們更新問題。 –

+0

你爲什麼認爲有內存泄漏?你的應用程序是否給你一個'OutOfMemoryException'?也許你只需要改變啓動應用程序的內存量。 – radimpe

回答

2

如果你想查找內存泄漏,你應該看看完整的GC後使用了多少內存,如果你有很多finalisable引用,則要兩次,否則你很可能會看到很多臨時對象,沒關係。

我懷疑你看到的數據類型都不是問題,尤其是如果他們定期使用它們。尋找消費只會增加。

+0

謝謝彼得。事實上,幾乎每個數據數據類型的內存消耗值都在增加。我的意思是說,如果10分鐘後消耗現在爲50kb,則爲56kb,執行gc後消耗爲53kb意味着10分鐘後3kb內存增加,並且週期性地僅以這種方式增加。它確認我的應用程序有內存泄漏嗎? –

+0

完整GC後許多MB增加可能是泄漏。我不擔心幾KB,因爲它可能是「噪音」。如果一切都在增加,則指向一個共同的因素,例如一個持有所有這些增長階層的集合。 –

+0

非常感謝彼得。 –

0

它是什麼結論?

首先,你所謂的「證據」是亂碼,不清楚什麼是不應該的。然而,基於一些猜測...我可以看到沒有任何明顯的內存泄漏跡象。

相反,它看起來如果你有一個大WeakHashMap,要麼成爲不可達,或者說得到了清理掉,因爲GC注意到堆是越來越太飽會發生什麼。

然而,我猜測可能是錯誤的,而且有可能在這裏泄漏...

原因是敲定()或參考的HashMap $項導致泄漏?

也不一定。 (事實上​​,如果確實是一個存儲泄漏的話,那是不可能,要麼這些是直接原因。)

+0

謝謝斯蒂芬。事實上,幾乎每個數據數據類型的內存消耗值都在增加。我的意思是說,如果10分鐘後消耗現在爲50kb,則爲56kb,執行gc後消耗爲53kb意味着10分鐘後3kb內存增加,並且週期性地僅以這種方式增加。它確認我的應用程序有內存泄漏嗎? –

+0

單個數據點不是內存泄漏的證據。一致的長期趨勢將是泄漏的證據。 –