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

时间:2010-02-15 17:08:21

标签: java profiling

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

  • 调用给定函数的次数
  • 每个函数调用的相对宽松程度(即每个函数执行需要多长时间)

我广泛知道瓶颈在我的应用中的位置,但我需要更精细的视图来缩小它的范围。

由于

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

7 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:13)

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

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

请参阅HPROF documentation page

在我的应用程序中,我使用:      -Xrunhprof:CPU =样品,螺纹= 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.<init>

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

答案 2 :(得分:4)

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

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

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

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

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

答案 3 :(得分:4)

Java 1.7 *与Java Mission Control(jmc)捆绑在一起,后者拥有“飞行记录器”和#39;功能,可用于分析方法执行。分析结果显示与AppDynamics几乎相似 - 易于发现性能问题(尤其是哪些方法占用了所有CPU)。

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

*不确定次要版本

答案 4 :(得分:2)

看看Eclipse TPTP。对于从Eclipse开始的任何应用程序,它们可以提供完全相同的功能。

答案 5 :(得分:2)

如果你愿意花一点钱,

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

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

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

答案 6 :(得分:1)

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