2010-06-28 24 views
5

我試圖診斷Sun One 9.1應用程序服務器中的PermGen內存泄漏問題。爲了做到這一點,我需要獲得JVM進程的堆轉儲。不幸的是,JVM進程是在Windows上運行的1.5版本。顯然,觸發堆轉儲的方式都不支持該設置。在內存不足或關閉時,我可以讓JVM執行堆轉儲,但是我需要能夠在任意時間獲得堆轉儲。觸發在Windows上運行的1.5 JVM的堆轉儲

經常提到的兩種獲取堆轉儲的方法是使用jmap或使用HotSpotDiagnostic MBean。這些都不支持Windows上的jvm 1.5。

有沒有我錯過的方法?如果有方法以編程方式觸發堆轉儲(不使用HotSpotDiagnostic MBean),那也可以...

如果在Windows中真的無法做到這一點,我想我必須訴諸構建一個Linux VM並在那裏進行調試。

謝謝。

+1

我已經訴諸使用-XX:+ HeapDumpOnOutOfMemoryError以及一個試圖分配非常大的數組的jsp頁面。當我需要內存轉儲時,我可以打到jsp頁面。工作得不錯。 – jthg 2010-06-29 19:58:14

回答

1

Java6引入了一個新的熱點選項,-XX:-HeapDumpOnOutOfMemoryError,它實際上被反向移植到Java5 JVM。當 java.lang.OutOfMemoryError拋出

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

轉儲堆到文件。 可管理。 (引入1.4.2 更新12,5.0更新7.)

它非常方便。 JVM只有足夠長的時間才能將堆轉儲到文件中,然後宕掉。

當然,這意味着你必須等待泄漏變得足夠糟糕才能觸發OutOfMemoryError

另一種方法是使用探查器,如YourKit。這提供了獲取正在運行的JVM的堆快照的方法。我相信它仍然支持Java5。

P.S.你真的需要升級到Java 6 ....

+0

謝謝。我一直在使用這種方法,但還不夠。我需要以某種方式在任意時間觸發堆轉儲。 – jthg 2010-06-28 21:14:06

+0

@jthg:那麼請參閱我提出的分析器建議 – skaffman 2010-06-28 21:17:48

+0

如果沒有免費的解決方案,我會考慮分析器。 – jthg 2010-06-28 21:23:18

0

如果是1.5.0_14或更高版本,可以使用-XX:+HeapDumpOnCtrlBreak,然後按Ctrl-歇在控制檯

+0

可以將Ctrl-Break發送給過程如果沒有控制檯?或者你知道是否有辦法讓Sun One App服務器爲jvm進程保留一個控制檯? – jthg 2010-06-28 21:16:10

+0

不確定Sun One服務器。常用的方法是:1-編輯啓動腳本(如果存在)並用java代替javaw; 2-找到主類並手動運行 – unbeli 2010-06-28 21:19:44