分析Java:找出线程花费时间被阻止的位置

时间:2010-11-12 04:18:39

标签: java multithreading profiling synchronized

我有一个多线程应用程序可以很好地扩展,但是在16-cpu服务器上运行,一旦我超过5或6个硬件线程,性能就会降低。我怀疑瓶颈围绕着其中一个同步方法。但是,在开始深入研究代码并尝试用非阻塞算法替换算法之前,我需要确定这是一种有罪的方法。

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

4 个答案:

答案 0 :(得分:1)

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

JProfiler有一个非常好的CPU分析器,有一些非常酷的功能可能对你有帮助,但它是商业的。

或者,您可以将统计信息收集到您的代码中(例如,测量执行您怀疑的每个同步方法所花费的时间,将其分解为等待同步/时间执行方法的时间),尽管这样做还要多得多

答案 1 :(得分:1)

你能试试this method吗?如果它适用于多个CPU,它应该会发现问题,但这是一个很大的“如果”。

基本上,当您看到线程被阻塞时,调用堆栈会告诉您确切原因。如果你不确定你是否看到了真正的问题,那就去做几次。

答案 2 :(得分:1)

http://yourkit.com监视器视图将告诉您哪些锁类很热,谁持有竞争锁并按锁实例和调用程序堆栈进行细分。该工具有30天的评估期。

答案 3 :(得分:0)

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