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

Mal*_*ker 29 java profiling

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

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

我大致知道瓶颈在我的应用中的位置,但我需要一个更精细的粒度视图来缩小它.

谢谢

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

Tho*_*sen 21

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


gub*_*bby 14

最简单的方法是使用-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.<init>
Run Code Online (Sandbox Code Playgroud)

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