2010-04-28 51 views
4

嗯,這是令人尷尬的......使用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爲您提供完整的詳細信息。

+0

嘗試jvisualvm,它有一個更好的接口 – 2010-04-28 01:07:51

+0

IDEs真的有用,直到他們不 – 2010-04-28 07:38:44

+0

@matt b:你是絕對正確的,它甚至告訴我文件名後堆轉儲! C:\ DOCUME〜1 \ ferrans \ LOCALS〜1 \ Temp \ visualvm.dat \ localhost-4180 \ heapdump-1272470561431.hprof添加這個答案,我會接受它。 – 2010-04-28 16:06:46

回答

8

嘗試jvisualvm,它有一個更好的接口。

請注意,從JDK版本6更新7或更高版本開始,Java VisualVM與JDK捆綁在一起。見here

+0

謝謝,這解決了我的問題*和*教我新的東西,非常有用! – 2010-04-28 22:47:02

2

您總是可以使用ProcessMonitor來查看它試圖寫入的內容:)過去自己完成此操作。

+0

@Chris:有趣的建議,我會試一試! – 2010-04-28 02:55:00

4

按照docs用於在Sun Java SE6 JVM:

默認情況下,堆轉儲在 創建一個名爲java_pid < PID在VM

的 工作目錄> .hprof

在Eclipse中,工作目錄是在「運行配置」對話框的「參數」選項卡上定義的。默認值是與您正在運行的類相同的目錄。

+0

謝謝Jason,我會看看Run Configurations對話框。我無法爲另一個進程創建第二個堆轉儲文件,這似乎與此命名方案相矛盾。 – 2010-04-28 02:54:21

+0

嗯,在進程的當前目錄中沒有hprof文件。由於jvisualvm在另一個目錄中設置了heapdump文件名,我想jconsole也可以嗎? – 2010-04-28 16:15:03

6

當您嘗試從jconsole調用dumpHeap()時,爲什麼不設置dumpHeap(String,boolean)的第一個參數?它是生成的heapdump文件的位置和文件名。

0

我發現轉儲的文件放置在啓動我的java應用程序的.bat文件所在的文件夾中。 (我使用的是Windows 8.1,Java 7) 在我的情況下,jboss,/ jboss-as/bin /文件夾。 要找到它,我搜索*文件,今天創建日期和超過200MB。