2009-08-12 48 views
8

我們有一個運行Java 5的長時間運行的服務器應用程序,並且通過分析我們可以看到,隨着時間的推移,老一代增長緩慢。它在一個完整的GC上正確釋放,但我希望能夠使用堆轉儲查看Eclipse MAT中不可訪問的對象。我已經使用+ XX:HeapDumpOnCtrlBreak成功獲得堆轉儲,但JVM在轉儲堆之前始終執行GC。顯然這不會發生在Java 6上,但現在我們被困在了5上。有什麼辦法可以防止這種情況發生?如何在不使用垃圾回收的情況下在Java 5上進行堆轉儲?

回答

1

我建議使用第三方分析器,例如YourKit,這可能允許您在不首先啓動GC的情況下拍攝快照。額外的獎勵,你可以在沒有整個ctrl-break shenanigans的情況下拍攝快照。

+0

謝謝,我其實有JProfiler的副本,但我沒有意識到這一點能做到這一點。我會放棄它。 – Colin 2009-08-14 14:59:40

3

我這裏有一些代碼,可以編程採取堆轉儲在JMX:

鏈接:JmxHeapDumper.java

在源代碼中的註釋包含2個鏈接到包含有關如何採取堆有用信息的文章轉儲。我不知道,但如果你運氣好,也許JMX的方法會有一些避免GC的方法。希望這可以幫助 !

+0

太好了,謝謝,我會去看看,看看它是否提前GC。實際上,以編程方式實現它似乎非常有用。 – Colin 2009-08-14 15:13:39

4

您是否嘗試過JDK附帶的標準jmap工具? 的JMAP收費用Java正式引入5.

實施例的命令行: /JAVA/bin中/ JMAP -heap:格式= B

結果可以使用標準工具與jHat或GUI應用程序進行處理如MAT。

9

使用jconsole或visualvm或jmc或...其他jmx管理控制檯。 在com.sun.management中打開HotSpotDiagnostic。 選擇方法dumpHeap和輸入兩個參數:

  • 路徑轉儲文件
  • (真/假)僅轉儲活動對象。使用false轉儲所有對象。

請注意,轉儲文件將由您連接到的JVM寫入,而不是由JVisualVM寫入,因此如果JVM在其他系統上運行,它將寫入該系統。

enter image description here

+0

這應該是被接受的答案,因爲它只是使用JDK附帶的常規工具。 – mjuarez 2017-11-29 20:01:03

+1

請注意,VisualVM需要這個「VisualVM-MBeans」插件。 – Natan 2018-01-18 14:37:14