10

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

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

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

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

4

12 回答 12

12

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

于 2008-09-18T05:07:50.123 回答
3

使用分析器(例如yourkit

于 2008-09-18T05:08:45.770 回答
2

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

于 2008-09-18T05:07:56.973 回答
2

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

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

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

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

祝你好运!

于 2008-09-18T05:39:25.460 回答
1

1)这是你的错:)

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

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

于 2008-09-18T05:08:14.757 回答
1

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

于 2008-09-18T05:08:26.363 回答
1

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

于 2008-09-18T05:08:30.107 回答
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% 的情况下,我们将能够使用线程转储进行识别。

于 2008-09-18T06:47:53.143 回答
1

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

Eclipse、Maven、Ant 和 IDEA 的插件可用。它对开源是免费的,或者您可以获得30 天的评估许可证

于 2008-09-18T06:59:42.257 回答
1

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

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

那里有很多更强大的工具,但请先玩免费的。然后,当您了解其他可用的功能时,您将对它们如何帮助您有所了解。

于 2008-09-18T09:15:00.420 回答
0

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

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

于 2008-09-18T05:13:58.953 回答
0

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

于 2008-09-18T12:24:19.480 回答