【问题标题】:How to find CPU-intensive class in Java?如何在 Java 中找到 CPU 密集型类?
【发布时间】:2011-02-26 12:10:55
【问题描述】:

我有一个使用多线程的 Java 大程序。在某些情况下,程序开始 100% 使用我的八核系统的三个核。在正常使用中,程序以 1-2% 使用所有内核。如何找到重载内核的类?

【问题讨论】:

  • 一般来说,一个类并没有使你的机器超载,可能是某个特定的方法。

标签: java performance multithreading class


【解决方案1】:

使用与 jdk-1.6.0_10 捆绑的 jvisualvm 等分析器

【讨论】:

  • 您可能想要寻找繁忙的等待循环:(while !done) {}。一个正确编写的线程很少会 100% 完成有意义的工作,通常计算偶尔会被 I/O 或同步阻塞。 -- 一个好的 CPU 使用率图表应该看起来有点波动。
【解决方案2】:

最好的解决方案是使用分析器——它们就是为此而构建的,Java 6 中捆绑了一个很棒的工具。

另一个(远非理想的解决方案)是在调试模式下在 Eclipse IDE(如果您使用的是该 IDE)中运行您的程序。然后,您可以查看正在运行的线程。如果他们中的很多人被暂停,那么没有被暂停的可能是你的罪魁祸首。强制它中断(从工具栏),你可以看到它在哪里。有很多机会您会发现一个清晰的循环或忙于等待。

【讨论】:

    【解决方案3】:

    使用分析器确定哪些线程正在使用所有 CPU 周期,以及它们正在执行的方法。

    【讨论】:

      【解决方案4】:

      如果您使用的是 Eclipse,则可以使用TPTP profiling tool

      【讨论】:

        【解决方案5】:

        如果您要使用商业分析器路线,那么我建议您使用Dynatrace

        【讨论】:

        • 在财务和管理费用方面都非常昂贵。 williamlouth.wordpress.com/2010/05/25/…
        • 我不确定它有多贵,但我发现它比 JProbe 更有用。 Dynatrace 纯路径非常彻底,并且在方法级别、sql 级别、api 级别很好地分解了报告。您可以使用客户端分析器查看 java 脚本执行、ajax 调用时间、渲染时间、网络时间。我相信它可能是有代价的。这就是为什么我说如果 OP 花钱买广告,他可以去看看。
        【解决方案6】:

        尝试进行线程转储(参见 jps、jstack 命令),然后查看执行了哪些方法。

        【讨论】:

        • 仅仅查看哪些方法被执行得最频繁与找出程序在哪里花费最多的处理时间是不同的。
        • @Jesper:像 10 次一样执行此操作,然后查找位于多个堆栈样本上的语句。那么包含一条线的样本分数是该线负责的时间分数,并且不会花费该线。 “程序将时间花在哪里”的概念忽略了导致时间花在较低级别的方法调用的责任。
        • @Mike 我的观点是,您应该衡量程序的哪些部分花费了多少时间,而不仅仅是调用了多少次方法。你可以有一个方法被调用 1000 次但只使用了 10% 的时间,或者一个方法被调用了 100 次但使用了程序 90% 的时间。在这种情况下,要进行优化,您必须专注于调用频率较低的方法。
        • @Jesper:你说得对,调用计数几乎毫无意义。 @maximdim 是正确的,您应该对线程进行堆栈转储。太多人将“程序花费时间的地方”解释为“程序计数器花费时间的地方”。程序通过调用其他程序来“花费时间”。对 PC 进行采样不会揭示这一点,但对堆栈进行采样确实会揭示这一点,并且不需要大量样本。
        • ...关于这个主题的内容可能比您想知道的更多:-) stackoverflow.com/questions/1777556/alternatives-to-gprof/…
        【解决方案7】:

        如果您在 UNIX 或某些版本的 Linux 上使用 Java,请查看 DTrace with Java。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多