2010-11-12 113 views
5

我有一个多线程应用程序,它可以很好地扩展到16位cpu服务器上,一旦超过5或6个硬件线程,性能就会停止。 I suspect瓶颈包围其中一种同步方法。但是,在开始深入代码并试图用非阻塞代码替换算法之前,我需要确定这是有罪的方法。分析Java:找出线程花费时间阻塞的位置

使用-Xprof参数运行Java告诉我,正如我所料,线程正在花费大部分时间。有没有办法,我可以打破他们花了多少时间阻止在特定的方法

回答

1

http://yourkit.com监视器视图会告诉你哪些锁定类是热门的,谁持有竞争的锁和通过锁实例和调用者堆栈进行细分。该工具有30天的评估期。

1

JDK附带的jvisualvm工具可以帮助您一点点,尽管它的CPU分析信息相当有限(更多用于Xprof数据的可视化工具)。我通常发现它对内存分析更有用。

JProfiler有一个非常漂亮的CPU分析器与一些非常酷的功能,可能会帮助你,但它是商业。或者,您可以向您的代码添加统计信息收集(例如,测量执行您怀疑的每个同步方法所需的时间,并将其分解为等待同步/执行该方法的时间),但这还有很多其他的方法工作。

1

你可以试试this method?如果它在多个CPU上工作,它应该找到问题,但这是一个很大的“如果”。

基本上,当你看到一个线程被阻塞时,调用栈告诉你到底为什么。如果您不确定是否看到真正的问题,请多做几次。

0

Eclipse TPTP是另一个非常好的免费分析器。