6

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

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

4

4 回答 4

1

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

JProfiler 有一个相当不错的 CPU 分析器,它具有一些非常酷的功能,可能会对您有所帮助,但它是商业的。

或者,您可以将统计信息收集添加到您的代码中(例如,测量执行您怀疑的每个同步方法所需的时间,将其分解为等待同步/执行该方法的时间),尽管这需要更多的工作。

于 2010-11-12T04:46:29.567 回答
1

你能试试这个方法吗?如果它可以跨多个 CPU 工作,它应该会发现问题,但这是一个很大的“如果”。

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

于 2010-11-12T14:52:59.213 回答
1

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

于 2010-11-13T14:05:23.273 回答
0

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

于 2010-11-13T11:15:09.887 回答