Java应用程序性能分析器

27

我需要优化一个Java应用程序。它会调用一些第三方API。我需要一个好的工具来准确地测量各个API调用所花费的时间。

为了让您明白其复杂程度,这个应用程序需要处理包含100万行数据的数据源文件,处理过程大约需要1个小时。在处理过程中,它要调用一些第三方API(包括一些网络调用)。我需要确定哪些调用比其他调用花费更多的时间,并根据此找到一种优化应用程序的方法。

如有建议,不胜感激。


1
请测量 Java 开发中的性能。 - b.roth
如何设置VisualVM:http://sysdotoutdotprint.com/index.php/2017/08/01/turn-profiler-java/ - mel3kings
请考虑使用 https://github.com/jvm-profiling-tools/async-profiler 和 https://github.com/jvm-profiling-tools/honest-profiler。 - Vadzim
8个回答

31
我可以推荐JVisualVM。它是一个与Oracle/Sun JDK捆绑在一起的出色监控/分析工具。只需启动它,连接到您的应用程序并开始CPU分析即可。您应该获得很好的直方图,了解时间花费在哪里。 Getting Started with VisualVM有一个出色的屏幕录像,向您展示如何使用它。
屏幕截图:

VisualVM screenshot


另一种更基础的选择是使用-Xprof命令行选项:

-Xprof

对正在运行的程序进行分析,将分析数据发送到标准输出。该选项作为开发工具提供,有助于程序开发,但不建议在生产系统中使用。


1
VisualVM 也可以与你喜欢的集成开发环境进行整合。 - dfrankow
2
啊,不知道呢。你有没有什么好的网址可以解释如何让它与Eclipse一起使用? - aioobe
我来晚了一点,但是https://blog.idrsolutions.com/2013/05/setting-up-visualvm-in-under-5-minutes/解释了如何在Eclipse中设置VisualVM。 - Jeutnarg
如果您按照这些说明操作,但在启动时遇到NullPointerException问题,请参阅此Q&A https://dev59.com/FF8e5IYBdhLWcg3wYJmu - Jeutnarg
如何设置VisualVM:http://sysdotoutdotprint.com/index.php/2017/08/01/turn-profiler-java/ - mel3kings

7
我之前用过YourKit,觉得还不错。但我从未对长时间运行的操作进行过性能分析。
每一行的处理方式都一样吗?如果是这样的话,输入文件的大小就不是很重要了。你可以对子集进行性能分析,找出哪些调用比较耗时。

1
是的,我可以减小输入大小!谢谢。 - Nitin Garg

5
我想提到inspectIT工具。它最近完全开源(https://github.com/inspectIT/inspectIT)。它提供了完整且详细的调用图和上下文信息,并提供了许多用于数据库调用、HTTP监视、异常等的传感器。

这似乎非常适合您的使用情况。


2
尝试使用OPNET的全景软件产品。

1

在这种情况下,普通的分析器可能不是正确的工具,因为它们旨在测量被分析程序所用的 CPU 时间,而不是调用的外部 API,并且它们往往会产生很高的开销并收集大量数据,如果长时间运行可能会压垮您的系统。

如果您确实需要在如此长的时间内收集性能数据,主要是针对外部调用,则 Perf4J 可能是更好的工具。


1
你确定 Perf4j 能够正常工作吗?我尝试使用 System.currentTimeMillis(),但似乎精度不够。 - Nitin Garg
@Nitin:我猜它使用的是System.nanoTime(),这个方法具有更好的精确度。但根据你的描述,我觉得即使以毫秒为单位的粒度对于你的情况中耗时最长的部分(比如通过网络调用的第三方组件)也足够了。 - Michael Borgwardt

1
在我们的办公室,我们每天都使用YourKit性能分析工具。它非常轻巧,并且满足了我们所遇到的大多数与性能相关的需求。
但是我也用过Visual VM。它是免费且快速的。在尝试YourKit之前,你可能首先想要尝试一下Visual VM(YourKit并非免费软件)。

0

visualvm(SDK的一部分)和Java 7可以生成详细的性能分析报告。


0

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