代码之家  ›  专栏  ›  技术社区  ›  jjnguy Julien Chastang

Java:我怎样才能看到我的代码中运行最频繁的部分?(剖析)

  •  10
  • jjnguy Julien Chastang  · 技术社区  · 16 年前

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

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

    12 回复  |  直到 12 年前
        1
  •  12
  •   John Millikin    16 年前
        2
  •  3
  •   Ran Biron    16 年前

    使用探查器(例如 yourkit )

        3
  •  2
  •   Swati Markus    16 年前

    剖析?我不知道你在用什么IDE,但是 Eclipse has a decent proflier 此外,网站上还列出了一些开源分析器 java-source

        4
  •  2
  •   coobird    16 年前

    简而言之 profilers 将告诉您调用程序的哪个部分的频率。

    我不怎么介绍我的程序,所以我没有太多的经验,但我一直在玩 NetBeans IDE 当我测试它的时候。(我通常也使用Eclipse。我还将研究Eclipse中的评测功能。)

    Java profiler

    评测是一种技术,通常用于测量程序的哪些部分占用了大量的执行时间,这反过来又可用于评估执行优化是否有利于提高程序的性能。

    祝你好运

        5
  •  1
  •   JohnnyLambada    16 年前

    1) 这是你的错:)

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

    3) 如果做不到这一点,请在您认为内部循环所在的位置添加控制台输出——您应该能够快速找到它。

        6
  •  1
  •   Petr Macek    16 年前

    是的,有这样的工具:您必须分析代码。你可以试试 TPTP 在eclipse中,或者尝试 JProfiler

        7
  •  1
  •   Valentin Jacquemin    16 年前

    使用分析器。有很多。以下是一份清单: http://java-source.net/open-source/profilers . 例如,您可以使用 JIP

        8
  •  1
  •   npellow    16 年前

    Clover this line 被执行了7次。

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

        9
  •  1
  •   Bill Michell    16 年前

    如果您使用的是Sun Java 6,那么最新的JDK发行版将随附 JVisualVM 在bin目录中。这是一个功能强大的监视和分析工具,使用起来几乎不费吹灰之力—您甚至不需要使用特殊参数启动程序—JVisualVM只列出当前运行的所有java进程,您可以选择要使用的进程。

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

    现在有很多更强大的工具,但是先玩一玩免费的吧。然后,当你读到有哪些其他功能可用时,你会对它们如何帮助你有所了解。

        10
  •  1
  •   jjnguy Julien Chastang    12 年前

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

    有两种高CPU问题

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

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

    案例(b)也可以使用以相等间隔获取的线程转储进行分析。如果幸运的话,您将能够找到问题代码,如果您不能使用线程转储识别问题代码。你需要求助于剖析器。根据我的经验,YourKit profiler非常好。

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

        11
  •  0
  •   zxcv    16 年前

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

        12
  •  0
  •   Steve McLeod    16 年前

    在单线程代码中,我发现添加了如下语句: