Java:如何查看代码的哪些部分运行最多? (分析)

时间:2008-09-18 05:05:39

标签: java debugging user-interface profiling

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

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

我已经尝试过调试,但在这种情况下,逐步调试不能很好地工作。

是否有任何工具可以告诉我问题出在哪里?我目前正在使用Eclipse。

12 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

使用分析器(例如yourkit

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

NetBeans探查器将告诉您哪个线程正在执行多长时间,以及哪些方法被调用了多长时间,并将为您提供条形图以显示每个方法花费了多少时间。这应该会给你一个关于哪种方法导致问题的提示。如果您感到好奇,可以查看NetBeans IDE提供的Java profiler

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

祝你好运!

答案 4 :(得分:1)

1)这是你的错::)

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

3)如果失败了,在你认为内循环的地方添加控制台输出 - 你应该能够快速找到它。

答案 5 :(得分:1)

是的,有这样的工具:你必须分析代码。您可以在eclipse中尝试TPTP,也可以尝试JProfiler。这将让你看到被调用的内容和频率。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

有两种高CPU问题

a)线程在哪里使用一个核心的100%CPU(这是你的场景)

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

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

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

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

我总是首先尝试使用线程转储。 Profilers只是最后的选择。在80%的情况下,我们将能够识别使用线程转储。

答案 8 :(得分:1)

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

可以使用Eclipse,Maven,Ant和IDEA的插件。它是free for open source,或者您可以获得30 day evaluation license

答案 9 :(得分:1)

如果您使用的是Sun Java 6,那么最新的JDK版本会在bin目录中附带JVisualVM。这是一个功能强大的监视和分析工具,只需要很少的工作量 - 您甚至不需要使用特殊参数启动程序 - JVisualVM只列出所有当前运行的java进程,并选择要使用的进程

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

有很多更强大的工具,但首先要玩免费游戏。然后,当您了解其他功能的可用性时,您将获得有关它们如何帮助您的信息。

答案 10 :(得分:0)

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

我使用Clover和JUnit测试用例,但对于开源,我听说EMMA非常好。

答案 11 :(得分:0)

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