【问题标题】:Profiling Java: find out where threads spend time blocked分析 Java:找出线程花费时间阻塞的地方
【发布时间】:2011-05-08 21:00:05
【问题描述】:
我有一个多线程应用程序,它一开始就可以很好地扩展,但在 16-cpu 服务器上运行,一旦超过 5 或 6 个硬件线程,性能就会下降。我怀疑瓶颈围绕着同步方法之一。但是,在我开始深入研究代码并尝试用非阻塞算法替换算法之前,我需要确定这是有罪的方法。
使用 -Xprof 参数运行 Java 告诉我,正如我所料,线程大部分时间都处于阻塞状态。有没有办法可以将其分解为他们在在特定方法上花费了多少时间?
【问题讨论】:
标签:
java
multithreading
profiling
synchronized
【解决方案2】:
JDK 附带的 jvisualvm 工具可以为您提供一点帮助,尽管它的 CPU 分析信息相当有限(更多的是 Xprof 数据的可视化工具)。我通常发现它对内存分析更有用。
JProfiler 有一个非常不错的 CPU 分析器,它具有一些非常酷的功能,可能会对您有所帮助,但它是商业用途。
或者,您可以将统计信息收集添加到您的代码中(例如,测量执行您怀疑的每个同步方法所需的时间,将其分解为等待同步/执行该方法的时间),尽管这需要更多的工作.
【解决方案3】:
你能试试this method吗?如果它可以跨多个 CPU 工作,它应该会发现问题,但这是一个很大的“如果”。
基本上,当您看到某个线程被阻塞时,调用堆栈会准确地告诉您原因。如果您不确定自己是否看到了真正的问题,请多做几次。
【解决方案4】:
Eclipse TPTP 是另一个非常好的免费分析器。