【问题标题】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-02
            • 1970-01-01
            • 1970-01-01
            • 2014-02-20
            • 2011-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多