嗯,這是令人尷尬的......使用jconsole時Java轉儲堆文件的位置?
我開始玩Eclipse Memory Analyzer來查找Windows盒子上的Java內存泄漏。第1步是獲取堆轉儲文件。爲此,我從Eclipse內啓動我的Java(javaw.exe)進程,並使用jconsole連接到它。然後在jconsole MBeans選項卡上單擊dumpHeap按鈕。我第一次做到這一點時,看到一個彈出窗口說它創建了堆轉儲文件,但沒有給出它的名稱或位置。現在,每當我再次做了dumpHeap同時連接到不同的javaw.exe進程,JConsole的說:
Problem invoking dumpHeap : java.io.IOException: File exists
當然,不給它的名稱或路徑。它在哪裏?
我搜索了我的C:驅動器(使用cygwin命令行工具)包含「hprof」或「java_pid」或「heapdump」的文件,但沒有發現任何可能的東西。我甚至使用Windows搜索來查找Eclipse工作區中所有在最後一天發生更改的文件。
我正在使用Sun Java 1.6 JVM,並且沒有-XX:HeapDumpPath集。
更新(2010年4月28日):我的原始堆文件位置必須由jconsole確定,我從中觸發了堆轉儲。 JVM的堆轉儲位置必須僅適用於它觸發的堆轉儲(例如,在OutOfMemoryException上)。
馬特B的建議,使用jvisualvm很好地解決了我的問題,指向我一個更有用的老jconsole替代品。它有一個很好的內存分析器,可以顯示哪些類型的對象數量最多且內存最多。它有一個顯示器,顯示隨着時間的推移實際使用的內存。當你問它堆轉儲時,它甚至會告訴你文件名! Eclipse Memory Analyzer爲您提供完整的詳細信息。
嘗試jvisualvm,它有一個更好的接口 – 2010-04-28 01:07:51
IDEs真的有用,直到他們不 – 2010-04-28 07:38:44
@matt b:你是絕對正確的,它甚至告訴我文件名後堆轉儲! C:\ DOCUME〜1 \ ferrans \ LOCALS〜1 \ Temp \ visualvm.dat \ localhost-4180 \ heapdump-1272470561431.hprof添加這個答案,我會接受它。 – 2010-04-28 16:06:46