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

时间:2009-04-16 16:11:24

标签: java memory profiling profile

我在此之前已经意识到类似的问题已经被问到了这个问题,但让我准确描述一下我需要做什么:

我有一组运行命令行java应用程序的测试,我想为它们添加内存分析。我看到的一个选项是向我的应用程序添加代码(可能使用第三方工具/库),这将提供内存快照。另一种选择是使用第三方工具来管理/检测我的应用程序和JVM(理想情况下不需要我更改我的代码)。我想的是像Valgrind这样的东西,但是对于Java来说。如果可能的话,也是开源的。

我真正想做的是设置内存测试,以便定期监视我的内存使用情况,比方说每秒,然后转储到文本文件中。这样我就可以看到内存使用量是否会随着时间的推移而振荡/增加/减少。我还能够计算最大和最小峰值。

有人在这做过这样的事吗?

提前致谢。

9 个答案:

答案 0 :(得分:16)

使用像JProfiler这样的东西你需要做的就是向JVM添加某些参数。它使用JVMTI。

我认为你应该阅读有关个人资料的信息,以及他们能为你做些什么。我还建议阅读JVMTI。

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

注意:JVM TI取代了Java虚拟机概要分析程序界面(JVMPI)和Java虚拟机调试界面(JVMDI)。 JVMPI和JVMDI将在J2SETM的下一个主要版本中删除。

答案 1 :(得分:6)

Yourkit也有一个非常好的个人资料

答案 2 :(得分:4)

你检查了吗

VisualVMEclipse-Callisto

答案 3 :(得分:3)

一个好的起点是查看您的JVM是否支持“java -Xrunhprof”,因为这可以生成堆分析信息,而不会使您的场景更复杂。

请参阅http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html

你可能会发现这对你来说足够了。

答案 4 :(得分:2)

诸如yourkit之类的几个分析器具有用于跟踪内存分配的API。这里的另一个选择是监控工具,例如jxinsight  或glassboxjamon

为了分析堆转储,Eclipse Memory Analyzer是您可以获得的最佳工具。它是免费和开源的,因此您可以根据需要自动分析堆转储。

答案 5 :(得分:2)

我在Eclipse中开发,但我有Netbeans使用其优秀的Profiler。与一些商业相比,它是有限的,但仍然足以发现大多数瓶颈

答案 6 :(得分: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
 ...

答案 7 :(得分:1)

除了上述答案,我还很喜欢几年前使用的探查器。不知道这是否有帮助。

答案 8 :(得分:1)

我推荐dynaTrace生产版。配置内存应用程序的神奇工具。低开销和100%执行的交易。