Java分析 – 如何通过方法分析我的应用程序获取方法?

我想运行我的Java应用程序,并且对于给定的工作负载能够看到:

  • 调用给定函数的次数
  • 相对而言每个函数调用的成本是多少(即每个函数执行需要多长时间)

我大致知道瓶颈在我的应用中的位置,但我需要更细粒度的视图以缩小它的范围。

谢谢

编辑 jvisualvm看起来像工具 – 它在大约30秒内识别出问题。 我只需要知道“自我时间”在方法配置文件的上下文中意味着什么。 谢谢

对于在Sun的Java 6中运行的程序,最简单的方法是在jdk中使用jvisualvm程序。 允许您无需任何特殊设置即可附加和配置文件。

最简单的方法是使用-prof,例如:java -prof -jar yourjar.jar

这将在程序运行完毕后打印一个名为java.prof的文件。

请参阅HPROF文档页面

在我的应用程序中,我使用:-Xrunhprof:cpu = samples,thread = y,doe = y

这将打印一份报告,其中包含以下内容:

 CPU SAMPLES BEGIN (total = 55110) Sun Feb 7 17:02:51 2010 rank self accum count trace method 1 69.68% 69.68% 38399 300361 java.net.SocketInputStream.socketRead0 2 24.40% 94.08% 13448 300386 java.net.SocketInputStream.socketRead0 3 0.20% 94.28% 108 300425 java.io.FileOutputStream.writeBytes 4 0.19% 94.47% 107 300976 java.net.PlainDatagramSocketImpl.receive0 5 0.19% 94.65% 102 300414 package.BlockingSampleBuffer.addSample 6 0.16% 94.82% 90 300365 java.net.SocketOutputStream.socketWrite0 7 0.16% 94.98% 89 300412 package.BlockingSampleBuffer.addSample 8 0.15% 95.13% 84 300430 java.lang.Object.wait 9 0.14% 95.27% 77 300592 java.io.FileOutputStream.writeBytes 10 0.14% 95.41% 76 300566 java.lang.AbstractStringBuilder. 

因此,您可以看到在各种方法中花费的总时间(以秒为单位)。 在我的应用中,应用程序花费大部分时间等待来自远程主机的数据(通过互联网连接不太可能)。

已经列出了几个分析器(eclipse one和JProfiler)。 我只想强烈建议探查器是编程工具箱中的工具之一。

这是大多数程序员传递的东西,但是分析器可以解决非常难以解决的所有类问题。

我只是说(对每个人,而不仅仅是提问者),如果你没有使用过探查器,请找一个,下载并运行它。

顺便说一句,它们比java工具的静态输出更强大 – 尽管在这种特定情况下java工具可能就足够了。 分析器可以告诉您每个线程正在做什么,并可以制作一些非常酷的调用图形(流程图样式),它将帮助您分析您未编写的代码。

只需找到一个,并使用它一两个星期,以便你知道它提供了什么。

Java 1.7 *捆绑了Java Mission Control(jmc),它具有“Flight Recorder”function,可用于分析方法执行。 分析结果显示与AppDynamics几乎相似 – 易于发现性能问题(尤其是哪些方法占用了所有CPU)。

虽然不详细,但很好的博客文章解释了关于飞行记录器: http : //hirt.se/blog/?p = 364

*不确定次要版本

看看Eclipse TPTP 。 对于从Eclipse启动的任何应用程序,它们可以提供完全相同的function。

如果你愿意花一点钱,

JProfiler: http ://www.ej-technologies.com/products/jprofiler/overview.html

非常好,它显示了使用的时间百分比,使用的绝对时间和调用方法级别。 它理解EJB调用,Web服务调用,甚至可以显示jdbc调用的SQL。 我经常使用它来查找性能问题。

它也有内存分析,但我发现cpu分析更有用。

这正是AOP帮助的地方。 可以在不更改代码的情况下添加/删除方面。 如果你使用的是Spring; 创建包括JoinPoint的Aspect,列出用于评估执行时间的类和公共方法的建议。 将这些bean添加到Spring配置中。 否则使用AspectJ Container进行非弹簧应用