在Java应用程序中,分析内存使用情况的最佳方法是什么?

24

我知道这里已经有关于类似问题的提问了,但是让我来准确地描述一下我的需求:

我有一组测试用例,运行一个命令行Java应用程序,并且我想为它们添加内存分析。我看到的一个选项是向我的应用程序中添加代码(可能使用第三方工具/库),以提供内存快照。另一个选项是使用第三方工具来管理/检测我的应用程序和JVM(最好不需要我改变我的代码)。我考虑使用类似于Valgrind的东西,但是用于Java。而且最好是开源的。

我真正想做的是设置内存测试,使得我的内存使用量以固定间隔监控,比如每秒钟一次,并被转储到文本文件中。这样我就能够看到内存使用量是否随时间振荡/增加/减少。我还将能够计算最大和最小峰值。

这里有没有人做过类似于这样的事情?

提前感谢。

9个回答

16

使用像JProfiler这样的工具,您只需向JVM添加特定的参数即可。它使用JVMTI。

我认为您应该了解一下分析器及其对您的作用。我也建议您研究一下JVMTI。

JVMTM工具接口(JVM TI)是一种新的本机编程接口,供工具使用。它提供了一种方式来检查处于Java虚拟机(JVM)中运行的应用程序的状态并控制其执行。JVM TI支持需要访问JVM状态的全部工具范畴,包括但不限于:分析、调试、监视、线程分析和覆盖分析工具。

注意:JVM TI取代了Java虚拟机剖析器接口(JVMPI)和Java虚拟机调试接口(JVMDI)。在下一个J2SE主要版本中,JVMPI和JVMDI将被移除。


6

Yourkit也有一个相当不错的性能分析工具。


4

3

2

一些性能分析工具,例如yourkit,提供了用于跟踪内存分配的API。另一个选项是监控工具,例如jxinsightglassboxjamon

对于分析堆转储文件,Eclipse Memory Analyzer是你可以得到的最好的工具。它是免费和开源的,所以你可以尽可能地自动化堆转储文件的分析。


2

我在使用Eclipse进行开发,但为了使用Netbeans优秀的分析器,我也安装了它。与某些商业工具相比,Netbeans的功能有限,但仍足以发现大多数瓶颈。


NetBeans Profiler已经与Java 6 u10一起整合到VisualVM分析器中。它非常好用! - Thorbjørn Ravn Andersen

2

您可以使用JRockit JVM附带的命令行实用程序jrcmd。如果您知道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
 ...

当我尝试这样做时,我会得到以下错误信息:无法打开套接字文件:目标进程未响应或未加载HotSpot VM。 - yazzapps.com

1
我推荐使用dynaTrace生产版。这是一个出色的内存应用分析工具,开销低且能够追踪到100%的执行事务。

1
除了上面的答案,我几年前也喜欢使用分析器。不知道这是否有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接