如何找出哪个方法占用了大量时间?

18

我的一个组件执行时间太长了。它调用了很多服务,而这些服务又调用了许多数据访问对象方法。现在,有没有办法获得它调用的每个方法所花费的时间?
我不想在每个方法之前和之后写上 System.currentmillis 来计算所需的时间,因为方法太多了。
我认为我可能需要使用拦截器或者任何分析工具可以做到这一点。我不确定,求助。


1
我相信大多数集成开发环境都内置了性能分析器功能。 - gigadot
不幸的是,我是Netbeans的粉丝,但我想补充一下,Profiler测量的时间只给出了相对估计值。它并不是方法实际花费的时间。Profiler需要附加到方法上,这会导致额外的开销。 - gigadot
3个回答

9
使用应该随着JDK(如果我记得正确)一起提供的 jvisualvm。它是您的JVM的GUI,具有非常好的功能。查看其 功能,还有一些屏幕截图...
您可以按照以下步骤将其集成为eclipse中的启动器 在eclipse中集成的步骤

我正在使用这个,但是我无法找到它显示方法所需时间的地方,或者根本不显示时间。 - Rakesh Juyal
1
当您运行应用程序时,应激活CPU和内存分析器/采样器。然后,您将能够积极地查看热点。执行完毕后,它会组装一个非常整洁的报告,您可以在其中监视阻塞软件的不同部分。(请参见:http://visualvm.java.net/images/profiler.jpg)希望这有所帮助。 - posdef

1

1

不要把它看作是测量时间来找问题。

利用它的缓慢来暴露它。 只需使用与无限循环相同的方法。

也就是说,在它变慢时暂停几次,每次检查每个线程的调用堆栈。 有罪的方法和代码行将出现在多个样本中。 请参阅本帖子的最后一段

这里有更多关于它如何工作的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接