【问题标题】:Java: How can I see what parts of my code are running the most? (profiling)Java:如何查看我的代码的哪些部分运行得最多? (分析)
【发布时间】:2010-09-10 13:11:45
【问题描述】:

我正在用 Java 编写一个简单的跳棋游戏。当我将鼠标悬停在电路板上时,我的处理器会加速到 50%(内核上为 100%)。

我想知道我的代码的哪一部分(假设是我的错)在此期间正在执行。

我尝试过调试,但在这种情况下,逐步调试效果不佳。

有什么工具可以告诉我问题出在哪里?我目前正在使用 Eclipse。

【问题讨论】:

  • 谢谢大家!我正在使用 Eclipse 顺便说一句

标签: java debugging user-interface profiling


【解决方案1】:

这是一个典型的“高 CPU”问题。

有两种高CPU问题

a) 线程在哪里使用一个核心的 100% CPU(这是您的方案)

b) 当我们执行某些操作时,CPU 使用率“异常高”。在这种情况下,CPU 可能不是 100%,但会异常高。通常,当我们在代码中进行 CPU 密集型操作(如 XML 解析、序列化反序列化等)时,就会发生这种情况。

案例(a)很容易分析。当您在 30 秒间隔内遇到 100% CPU 5-6 线程转储时。寻找一个处于活动状态(处于“可运行”状态)并且在同一方法中的线程(您可以通过监视线程堆栈来推断)。您很可能会看到“忙等待”(请参阅​​下面的代码以获取示例)

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

情况 (b) 也可以使用等间隔的线程转储进行分析。如果幸运的话,您将能够找到问题代码,如果您无法使用线程转储来识别问题代码。您需要求助于分析器。根据我的经验,YourKit 分析器非常好。

我总是先尝试线程转储。探查器将只是最后的手段。在 80% 的情况下,我们将能够使用线程转储进行识别。

【讨论】:

    【解决方案2】:

    在单线程代码中,我发现添加了一些这样的语句: System.out.println("A:"+ System.currentTimeMillis()); 与使用分析器一样简单且有效。您可以很快缩小导致问题的代码部分。

    【讨论】:

    • 它是多线程的。但我会再记住这个提示。
    【解决方案3】:

    如果您使用的是 Sun Java 6,那么最新的 JDK 版本在 bin 目录中带有 JVisualVM。这是一个功能强大的监控和分析工具,使用起来非常简单——你甚至不需要使用特殊参数启动你的程序——JVisualVM 简单地列出所有当前正在运行的 java 进程,然后你选择你想玩的那个.

    此工具将告诉您哪些方法正在使用所有处理器时间。

    市面上有很多更强大的工具,但请先免费试用一下。然后,当您了解还有哪些其他功能可用时,您会大致了解它们如何为您提供帮助。

    【讨论】:

      【解决方案4】:

      Clover 会给出一个很好的报告,显示每个行和分支的命中计数。例如,this line 被执行了 7 次。

      Eclipse、Maven、Ant 和 IDEA 的插件可用。是free for open source,或者你可以得到一个30 day evaluation license

      【讨论】:

        【解决方案5】:

        简而言之,profilers 会告诉您程序的哪一部分被调用了多少次。

        我没有过多地分析我的程序,所以我没有太多经验,但我在测试时使用了NetBeans IDE 分析器。 (我通常也使用 Eclipse。我还将研究 Eclipse 中的分析功能。)

        NetBeans 分析器会告诉您哪个线程执行了多长时间,哪些方法被调用了多长时间,并且会为您提供条形图来显示每个方法花费了多少时间。这应该会提示您哪种方法会导致问题。感兴趣的可以看看 NetBeans IDE 提供的Java profiler

        分析是一种技术,通常用于衡量程序的哪些部分占用了大量执行时间,进而可以用来评估执行优化是否有利于提高程序的性能.

        祝你好运!

        【讨论】:

          【解决方案6】:

          或者为您的一些常见组件使用 JUnit 测试用例和代码覆盖率工具。如果存在调用其他组件的组件,您将很快看到这些组件执行了很多次。

          我将 Clover 与 JUnit 测试用例一起使用,但对于开源,我听说 EMMA 相当不错。

          【讨论】:

            【解决方案7】:

            使用分析器(例如yourkit

            【讨论】:

              【解决方案8】:

              使用分析器。有许多。这是一个列表:http://java-source.net/open-source/profilers。 例如,您可以使用JIP,这是一个 java 编码的分析器。

              【讨论】:

                【解决方案9】:

                是的,有这样的工具:您必须分析代码。您可以在 Eclipse 中尝试TPTP,也可以尝试JProfiler。这将让您了解调用的内容以及调用频率。

                【讨论】:

                  【解决方案10】:

                  1) 这是你的错:)

                  2) 如果您使用的是 eclipse 或 netbeans,请尝试使用分析功能——它应该会很快告诉您代码在哪里花费了大量时间。

                  3) 如果失败,请在您认为内部循环所在的位置添加控制台输出 - 您应该能够快速找到它。

                  【讨论】:

                    【解决方案11】:

                    分析?我不知道您使用的是什么 IDE,但Eclipse has a decent proflier 并且在java-source 也有一些开源分析器的列表。

                    【讨论】:

                    • 你能写一些使用TPTP的技巧吗?那将是黄金!
                    【解决方案12】:

                    这称为“分析”。您的 IDE 可能附带一个:请参阅 Open Source Profilers in Java

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-10-30
                      • 2011-03-03
                      相关资源
                      最近更新 更多