2009-10-28 155 views
4

有沒有人使用Eclipse內存管理器來檢測java代碼中的內存泄漏?任何人都可以推薦一個好地方來尋找關於使用內存管理器的信息嗎?我在網上閱讀了一些內容,這表明我需要讓程序運行直到崩潰(發生內存不足錯誤),這會生成崩潰報告。然後使用內存管理器打開此報告來檢查內存泄漏可能發生的位置。這是大家如何使用內存管理器?Java內存泄漏

回答

2

雖然-XX:+HeapDumpOnOutOfMemoryError可能是有用的,我使用Eclipse的內存管理器當前的工作流程是:

  1. 運行程序正常
  2. 等待內存不可收拾。
  3. 運行jmapjmap -dump:format=b,file=dump.hprof <PID>
  4. 在EMM中打開hprof文件。

我通常開始使用直方圖和支配樹視圖來查看是否有任何東西出現重擊,然後從那裏鑽取。

VisualVM可能很有用,但在使用堆轉儲(EMM緩存大量關於加載堆轉儲的信息)時,效率似乎比EMM低很多。 Netbeans Profiler非常適合獲取分配位置和時間分析。

2

也許最簡單的事情是在HProf(標準配置JVM)下運行程序一段時間,然後強制退出。 HProf的輸出應該有希望給你一些直接的指示。你的內存泄漏。與Eclipse內存調試器(我只從你寫的內容中知道的)不同,你可以從執行的任何點收集統計信息。

1

This page解釋瞭如何使用jvm堆轉儲。 Jhat是一種更簡單的圖形化工作方式,但也可以將相同的轉儲文件加載到eclipse內存管理器中。如果您使用的是當前(1.6)jvm,您還可以從jvisualvm獲得一些信息。

2

它表明我需要讓程序運行直到它崩潰(發生內存不足錯誤),這將生成一個崩潰報告。

我不認爲這是真的 - 當OutOfMemoryError發生(我敢打賭作者是混淆了某種JVM這種錯誤的問題,會導致核心轉儲你不會得到轉儲文件被保存)。

最好的程序是使用jmap進行堆轉儲;這會將堆的內容輸出到二進制文件(通常稱爲hprof文件)。此文件可通過任意數量的分析儀進行分析:

  • jhat - 孫工具,分析HPROF文件,啓動了一個嵌入式Web服務器,以便您可以分析堆通網絡瀏覽器/查看報告。我發現這是非常慢大堆。
  • VisualVM - 與JDK捆綁在一起的真棒調試/故障排除工具。除此之外,這也可以用於生成任何正在運行的進程的堆轉儲以及線程轉儲。我發現加載大型hprof文件的速度也很慢。
  • Eclipse Memory Analyzer - Eclipse插件,可以生成hprof文件。

我強烈建議使用Eclipse插件,因爲它非常快速地加載大型(> 500MB)堆轉儲(在一分鐘內),生成有用的報告,支持具有複雜邏輯的查詢語言等。

+1

您可以使用[1] [--XX:+ HeapDumpOnOutOfMemoryError]在OOME上請求堆轉儲。 [1] http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/clopts.html – 2009-10-28 16:21:08

+0

沒有意識到,有用的知道 - 謝謝! – 2009-10-28 17:23:23

0

我通常更喜歡使用NetBeans Profiler進行性能分析的應用程序。在大多數情況下,您可以很容易地看到哪些對象正在泄漏以及創建的位置。可能還有其他幾個工具也會這樣做,但我知道NetBeans Profiler運行良好,並且易於使用。

+0

這裏是一個教程http://www.netbeans.org/kb/articles/nb-profiler-uncoveringleaks_pt1.html – 2009-10-28 16:27:27

0

您可以嘗試使用Jprobe。您可以監視應用程序,並可以在創建對象時查看它們。此外,這將有助於分析哪些對象不會被垃圾收集,並將成爲繼續前進的指針。

雖然它不是免費的,但我記得它帶有一個試用許可證,所以檢查一下。