Java 分析 - 如何对应用程序进行逐个方法的分析?
我想运行我的Java应用程序,并且对于给定的工作负载,能够看到:
- 调用给定函数的次数
- 每个函数调用的相对成本(即每个函数调用执行所需的时间)
我大致知道瓶颈在我的应用程序中的位置,但我需要一个更细粒度的视图来缩小它的范围。
谢谢
编辑jvisualvm看起来像工具 - 它在大约30秒内发现了问题。我只需要知道“自拍时间”在方法配置文件的上下文中意味着什么。谢谢
我想运行我的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.<init>
因此,您可以看到在各种方法中花费的总时间(以秒为单位)。在我的应用程序中,应用程序花费大部分时间等待来自远程主机的数据(通过互联网连接不太可能)。