2009-04-16 42 views
22

我知道類似的問題已經被問到在此之前,所以讓我描述一下我需要做什麼:在Java應用程序中分析內存使用情況的最佳方法?

我有一組測試運行命令行java應用程序,我想向他們添加內存分析。我看到的一個選擇是將代碼(可能使用第三方工具/庫)添加到可提供內存快照的應用程序中。另一個選擇是使用第三方工具來管理/測試我的應用程序和JVM(並且理想情況下不需要我更改我的代碼)。我正在考慮像Valgrind,但是對於Java。如果可能的話也是開源的。

我真的很想做的就是設置內存測試,以便定期監視我的內存使用情況,讓我們說每秒鐘,然後轉儲到文本文件。這樣我就能夠看到內存使用量隨着時間的推移而變化/增加/減少。我也能夠計算最大和最小峯值。

有沒有人在這裏做過類似的事情?

在此先感謝。

回答

16

有了像JProfiler這樣的東西,你需要做的就是向JVM添加一些參數。它使用JVMTI。

我認爲你應該閱讀探查者和他們能爲你做些什麼。我也建議閱讀JVMTI。

JVMTM工具接口(JVM TI)是一種新的本地編程接口,供工具使用。它提供了一種檢查狀態並控制在Java虛擬機(JVM)中運行的應用程序的執行的方法。 JVM TI支持需要訪問JVM狀態的全部工具,包括但不限於:分析,調試,監控,線程分析和覆蓋率分析工具。

注意:JVM TI取代了Java虛擬機Profiler接口(JVMPI)和Java虛擬機調試接口(JVMDI)。 JVMPI和JVMDI將在J2SETM的下一個主要版本中被刪除。

2

幾個Profiler的諸如yourkit有API的用於跟蹤內存分配。另一個選擇是監視工具,如jxinsightglassboxjamon

爲了分析堆轉儲Eclipse Memory Analyzer是你能得到的最好工具。它是免費且開源的,因此您可以根據需要自動分析堆轉儲。

1

除了上面的答案,我還喜歡使用探查器幾年前。不知道這是否有幫助。

2

我在Eclipse中開發,但我有Netbeans使用其優秀的Profiler。相比,一些商業的,但爲察覺大多數瓶頸

+0

netbeans分析器已經用Java 6 u10放入VisualVM分析器中。這是很不錯的! – 2009-04-30 21:58:40

2

您可以使用JRCMD這是一個命令行工具,自帶的JRockit JVM仍然不夠好,這是有限的。如果你知道Java進程的PID,你可以這樣做:

JROCKIt_HOME\bin\jrcmd <pid> print_object_summary 

,它會給你:

31.8% 3198k 41907 -137k [C 
11.9% 1196k  300  +0k [B 
11.4% 1151k 49118  +6k java/lang/String 
6.1% 612k  5604  +0k java/lang/Class 
4.3% 431k  2388  +0k [I 
3.5% 353k 15097  +0k java/util/HashMap$Entry 
... 
+0

我得到:無法打開套接字文件:目標進程沒有響應或HotSpot虛擬機未加載 當我試試這個 – Zubair 2011-01-27 13:32:16

1

我推薦的dynaTrace生產版本。驚人的工具來配置內存應用程序。低開銷和100%的已執行事務。

相關問題