我想运行我的Java应用程序,并且对于给定的工作负载能够看到:
我广泛知道瓶颈在我的应用中的位置,但我需要更精细的视图来缩小它的范围。
由于
编辑 jvisualvm看起来像工具 - 它在大约30秒内识别出问题。我只需要知道“自我时间”在方法配置文件的上下文中意味着什么。感谢
答案 0 :(得分:21)
在Sun的java 6中运行的程序的最简单方法是在jdk中使用jvisualvm程序。允许您无需任何特殊设置即可附加和配置文件。
答案 1 :(得分:13)
最简单的方法是使用-prof,例如: java -prof -jar yourjar.jar
在程序运行完毕后,将打印一个名为java.prof的文件。
在我的应用程序中,我使用: -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进行非弹簧应用