Java应用程序性能分析

23

我正在寻找一个Java代码剖析器,可以用于在生产环境下对我的应用程序进行剖析(它是在后端运行的服务)。主要我想要调用树型剖析,即如果a()调用b(),然后b()调用c(),那么a()、b()和c()都花费了多少时间,包括和不包括。

我看过jvisualvm和jprofiler,但这不是我想要的,因为我不能把它们绑定到我的生产应用程序上,否则会造成严重的性能问题。

此外,我也查看过metrics(https://github.com/dropwizard/metrics),但它没有给我提供剖析调用树的功能。

我需要类似Callgrind (http://valgrind.org/docs/manual/cl-manual.html) 的库,因为它提供调用树剖析功能和高级选项如避免调用循环(递归)。但我不确定Callgrind是否可以在生产环境中使用,因为它会在程序终止时转储数据。

有人能推荐一个好的调用树剖析器,可以在生产环境下使用而不会影响性能吗?


如果我没记错的话,你可以从另一个JVM(如JRockit)获取更多信息。不过这是基于我对多年前的模糊回忆。 - nablex
您所熟悉的JRockit分析功能已经整合到Oracle的JVM版本7u40+中。请参见下面关于Mission Control和Flight Recorder的回答。 - kc2001
5个回答

14

结合Flight Recorder,查看Java Mission Control。从Oracle JDK 7 Update 40(7u40)开始,Java Mission Control与HotSpot JVM捆绑在一起,因此高度集成并声称对运行时性能影响很小。我刚刚开始使用它,并且能看到一些调用树功能。

enter image description here


2
请注意,Mission Control和Flight Recorder并不是免费软件。您必须向Oracle付费才能使用它们。 - Sebastian Häni
1
显然,2018年Mission Control成为开源软件。请参见https://www.reddit.com/r/java/comments/8h9m9t/java_mission_control_open_sourced/。 - kc2001

10

一般来说,不推荐使用会影响应用程序的探查器。探查器的注入总是意味着无法控制的生产开销。

你可以使用采样探查器。采样探查器在可控间隔内拍摄堆栈跟踪快照。你得不到调用计数,但是,在运行一段时间后,你可以获得一个很好的概述,知道哪些地方是热点。由于你可以调整探查器的采样间隔,所以你可以影响它的开销。

JDK附带了一个可用的采样探查器,请参见java 7文档中的hprof页面。以前存在一些针对hprof CPU跟踪(而不是堆跟踪)的图形分析工具,现在已经消失了。不过,你已经可以使用生成的文本文件。

我简单看了一下上面提到的Java Mission Control内容。我认为它非常强大,能够满足许多需求,在白皮书中他们说只有2%的开销。然而,这并不完全符合我的个人需求或想法。对于我的应用程序,最好始终启用“轻量级”探查。


4

英特尔放大器 XEhttp://software.intel.com/en-us/intel-vtune-amplifier-xe的开销非常低,几乎不会引起注意。它使用栈采样技术来最小化影响,并且可以附加和分离到正在运行的非停机生产流程中。您甚至无需在分析过程中拥有源代码,可以在离线性能结果浏览后再深入研究源代码。


注意:虽然乍一看它可能不像是Java的工具,但它支持Java。 - Aaron Digulla

1
我不知道有哪个工具可以在不影响性能的情况下进行分析。您可以向您感兴趣的方法添加日志记录。确保在日志中包含时间戳,然后您就可以计时了。您还应该配置日志框架以异步记录以减少性能损失。像 AspectJ 这样的加载时织入器能够在运行时添加这些调用,这将使您能够轻松选择要监视的方法而无需不断更改源代码。使用 around 方面,甚至可以添加计时日志记录,因此您不必解析日志并尝试查找匹配的日志条目。请参阅此博客文章获取详细信息

请查看perfspy(tutorial),它可能已经默认提供了你所需的功能。

相关:


Aspect很棒!但是使用Aspect来进行调用树分析可能会过于繁琐,而且可能会影响应用程序的性能。你不这么认为吗? - Arry
1
是的,我在第一句话中确切地说了那个。你只能尝试在几个地方编织这个方面;通常一个高级方法就足以看出代码的大部分性能花费在哪个部分。永远记住,80%的代码已经足够好了。你需要确定那20%的时间花费了80%的时间。我也希望有一个简单的一键解决方案,但我还没有看到过。 - Aaron Digulla

0

1
请注意,要求工具推荐的问题在 Stack Overflow 上是不被允许的,因此不应该回答。我不完全确定,但这是一个九年前的问题,当时可能是可以被允许的。 - Adrian Mole

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