我正在寻找一个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是否可以用于生产,因为它会在程序终止时转储数据。
任何人都可以建议用于java的好的调用树分析器,可以在不影响性能的情况下用于生产吗?
答案 0 :(得分:13)
与Java Mission Control一起查看Flight Recorder。从Oracle JDK 7 Update 40(7u40)发布开始,Java Mission Control与HotSpot JVM捆绑在一起,因此它具有高度集成性,并且声称对运行时性能影响很小。我刚开始看它,我确实看到了一些调用树功能。
答案 1 :(得分:10)
一般情况下,您不会(或我不建议)为您的应用程序提供检测的分析器。仪表总是意味着无法控制的生产开销。
您可以使用的是采样分析器。采样分析器以可控间隔生成堆栈跟踪的快照。你没有得到的是呼叫计数,但是,在一些运行时之后,你会得到一个很好的概述,你有热点。由于您可以调整探查器的采样间隔,因此可以影响探测器的开销。
JDK附带了一个可用的采样分析器,请参阅hprof page in the java 7 documentation。 以前存在一些用于hprof cpu跟踪(而不是堆跟踪)的图形分析工具。现在他们走了。但是,您已经可以使用生成的文本文件。
我快速浏览了上面提到的Java Mission Control的内容。我认为它非常强大可以满足很多需求,在白皮书中他们说它只有2%的开销。然而,这并不完全是我个人需要或想要的。对于我的应用程序,最好始终启用“轻量级”分析。
答案 2 :(得分:4)
英特尔放大器XE http://software.intel.com/en-us/intel-vtune-amplifier-xe的开销很低,如果有明显的话。它使用堆栈采样技术来最小化影响,并且可以附加和分离到生产中运行的不间断过程。您甚至不需要在分析期间拥有源,您可以在离线性能结果浏览后稍后潜入源。
答案 3 :(得分:1)
我不知道任何可以在不影响性能的情况下进行分析的工具。
您可以将记录添加到您感兴趣的方法中。确保在日志中包含时间戳;然后你可以做时机。您还应该将日志记录框架配置为异步记录以减少性能损失。
像AspectJ这样的加载时间编织器能够在运行时添加这些调用,这样您就可以轻松选择要监视的方法,而无需一直更改源代码。
使用around
方面,您甚至可以添加计时日志记录,因此您不必解析日志并尝试查找匹配的日志条目。 See this blog post for details
看看perfspy(tutorial),它可能已经开箱即用。
相关: