2008-09-28 54 views
15

我已經設法在我正在開發的Java應用程序中獲得內存「泄漏」。當運行我的JUnit測試套件時,我隨機出現內存異常(java.lang.OutOfMemoryError)。如何查看Java中的堆?

我可以使用什麼工具來檢查我的Java應用程序的堆以查看堆中所有堆的使用情況,以便我可以計算出應該能夠進行垃圾回收的對象的引用。

回答

23

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/

+0

Visual VM和Netbeans Profiler允許您執行與EMA相同的操作。 – 2008-09-29 19:11:29

+1

我不知道netbeans,但我當然沒有在visual vm中找到'gc root'的最短路徑。 – Tom 2008-09-29 19:31:40

0

如果您使用的是支持GTK的系統,您可以嘗試使用JMP

6

如果你需要一些免費的,儘量VisualVM

從項目的描述:

VisualVM是集成命令行JDK工具和輕量級分析功能的可視化工具。專爲開發和生產時間使用而設計。

0

您可以嘗試屬於JRockit Mission Control工具套件的內存泄漏檢測器。它允許您在JVM運行時檢查堆。您不需要一直拍攝快照。您可以在線連接到JVM,然後查看垃圾收集之間的堆如何變化。您還可以檢查對象,以圖形方式跟蹤引用,並從應用程序當前分配對象的位置獲取堆棧跟蹤。這是一個簡短的introduction

該工具是免費使用的開發,你可以下載它here

1

使用Eclipse Memory Analyzer

沒有其他的工具,我知道,接近它的功能和性能,價格(免費和開源的)任何工具的分析,當堆轉儲。

2

這是一個很老的問題。很多人可能已經開始使用IntelliJ,因爲它最初是被回答的。的IntelliJ有一個插件,可以顯示被稱爲JVM Debugger Memory View內存使用情況。