2009-04-16 78 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%的已执行事务。

相关问题