Java应用程序分析

我正在寻找一个Java代码分析器,我可以用它来分析我的应用程序(它是一个在后端运行的服务)生产(所以意味着低调,它不能减慢我的应用程序)。 主要是我想调用树分析,也就是说a()调用b()然后b()调用c(),然后a()b()和c()花了多少时间,包括和排他。

已经看过jvisualvmjprofiler ,但这不是我想要的,因为我无法将我的生产应用程序绑定到它们,因为它会导致一个主要的性能问题。

此外,我确实通过了metrics ( https://github.com/dropwizard/metrics ),但它没有给我一个function来分析调用树。

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

任何人都可以建议用于java的好的调用树分析器,可以在不影响性能的情况下用于生产吗?

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

在此处输入图像描述

一般情况下,您不会(或我不建议)为您的应用程序提供检测的分析器。 仪表始终意味着无法控制的生产开销。

您可以使用的是采样分析器。 采样分析器以可控间隔生成堆栈跟踪的快照。 你没有得到的是呼叫计数,但是,在一些运行时之后,你可以很好地了解你有热点的地方。 由于您可以调整探查器的采样间隔,因此可以影响探测器的开销。

JDK附带了一个可用的采样分析器,请参阅java 7文档中的hprof页面 。 以前存在一些用于hprof cpu跟踪(而不是堆跟踪)的图形分析工具。 现在他们走了。 但是,您已经可以使用生成的文本文件。

我快速浏览了上面提到的Java Mission Control的内容。 我认为它非常强大可以满足很多需求,在白皮书中他们说它只有2%的开销。 然而,这并不完全是我个人需要或想要的。 对于我的应用程序,最好始终启用“轻量级”分析。

英特尔放大器XE http://software.intel.com/en-us/intel-vtune-amplifier-xe的开销很低,如果有任何明显的话。 它使用堆栈采样技术来最小化影响,并且可以附加和分离到生产中运行的不间断过程。 您甚至不需要在分析期间拥有源,您可以在离线性能结果浏览之后潜入源。

我不知道任何可以在不影响性能的情况下进行分析的工具。

您可以将日志记录添加到您感兴趣的方法中。确保在日志中包含时间戳; 然后你可以做时机。 您还应该将日志记录框架配置为异步日志以减少性能损失。

像AspectJ这样的加载时间编织器能够在运行时添加这些调用,这样您就可以轻松选择要监视的方法,而无需一直更改源代码。

使用around方面,您甚至可以添加计时日志记录,因此您不必解析日志并尝试查找匹配的日志条目。 有关详细信息,请参阅此博文 。

看看perfspy ( 教程 ),它可能已经开箱即用了你需要的东西。

有关: