我已經設法在我正在開發的Java應用程序中獲得內存「泄漏」。當運行我的JUnit測試套件時,我隨機出現內存異常(java.lang.OutOfMemoryError)。如何查看Java中的堆?
我可以使用什麼工具來檢查我的Java應用程序的堆以查看堆中所有堆的使用情況,以便我可以計算出應該能夠進行垃圾回收的對象的引用。
我已經設法在我正在開發的Java應用程序中獲得內存「泄漏」。當運行我的JUnit測試套件時,我隨機出現內存異常(java.lang.OutOfMemoryError)。如何查看Java中的堆?
我可以使用什麼工具來檢查我的Java應用程序的堆以查看堆中所有堆的使用情況,以便我可以計算出應該能夠進行垃圾回收的對象的引用。
VisualVM包含在最新版本的Java中。您可以使用它來創建堆轉儲,並查看其中的對象。
另外,您還可以創建使用JMAP堆轉儲commandine(在你的JDK/bin目錄):
jmap -dump:format=b,file=heap.bin <pid>
你甚至可以用它來獲取所有對象的快速直方圖
jmap -histo <pid>
我可以推薦Eclipse內存分析器(http://eclipse.org/mat)進行堆轉儲的高級分析。它可以讓你準確找出爲什麼某個對象或某組對象是活着的。下面是一個博客條目,向您展示內存分析器可以執行的操作:http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/
如果您使用的是支持GTK的系統,您可以嘗試使用JMP。
使用分析器像JProfiler或YourKitProfiler
JProfiler的工作非常出色,我....
http://www.ej-technologies.com/products/jprofiler/overview.html
您可以嘗試屬於JRockit Mission Control工具套件的內存泄漏檢測器。它允許您在JVM運行時檢查堆。您不需要一直拍攝快照。您可以在線連接到JVM,然後查看垃圾收集之間的堆如何變化。您還可以檢查對象,以圖形方式跟蹤引用,並從應用程序當前分配對象的位置獲取堆棧跟蹤。這是一個簡短的introduction。
該工具是免費使用的開發,你可以下載它here。
沒有其他的工具,我知道,接近它的功能和性能,價格(免費和開源的)任何工具的分析,當堆轉儲。
這是一個很老的問題。很多人可能已經開始使用IntelliJ,因爲它最初是被回答的。的IntelliJ有一個插件,可以顯示被稱爲JVM Debugger Memory View內存使用情況。
Visual VM和Netbeans Profiler允許您執行與EMA相同的操作。 – 2008-09-29 19:11:29
我不知道netbeans,但我當然沒有在visual vm中找到'gc root'的最短路徑。 – Tom 2008-09-29 19:31:40