我正在用Java编写一个简单的跳棋游戏。 当我将鼠标悬停在棋盘上时,我的处理器会飙升到50%(核心上达到100%)。
我想找出在此期间执行的代码的哪个部分(假设这是我的问题)。
我尝试了调试,但逐步调试在这种情况下效果不佳。
是否有任何工具可以告诉我问题所在? 我目前正在使用Eclipse。
我正在用Java编写一个简单的跳棋游戏。 当我将鼠标悬停在棋盘上时,我的处理器会飙升到50%(核心上达到100%)。
我想找出在此期间执行的代码的哪个部分(假设这是我的问题)。
我尝试了调试,但逐步调试在这种情况下效果不佳。
是否有任何工具可以告诉我问题所在? 我目前正在使用Eclipse。
优化分析?我不知道你使用的是什么IDE,但Eclipse有一个不错的分析工具,同时在java-source上也有一些开源分析工具列表。
这是一个典型的'高CPU'问题。
高CPU问题有两种类型:
a) 一条线程使用了一个核心的100% CPU(这是您的情况)
b) 当我们执行某些操作时,CPU使用率异常高。在这种情况下,CPU可能不是100%,但会异常高。通常,当代码中存在CPU密集型操作,例如XML解析,序列化反序列化等时,就会发生这种情况。
情况(a)很容易分析。当您在30秒的时间间隔内经历了5-6个线程转储时,请查找处于“运行”状态且在同一方法内部的活动线程(您可以通过监视线程堆栈来推断出来)。最有可能的是,您会看到一个“忙等待”(请参阅下面的代码示例)。
while(true){
if(status) break;
// Thread.sleep(60000); // such a statement would have avoided busy wait
}
情况(b)也可以使用等间隔的线程转储进行分析。如果你很幸运,你将能够找到问题代码,如果你无法通过使用线程转储来识别问题代码,则需要求助于分析器。在我的经验中,YourKit分析器非常好。
我总是先尝试使用线程转储。分析器只会是最后的手段。在80%的情况下,我们将能够使用线程转储进行识别。
1) 这是你的错 :)
2) 如果你正在使用Eclipse或Netbeans,请尝试使用分析功能 - 它应该很快告诉你代码花费了大量时间的地方。
3) 如果还不行,在你认为内部循环的位置添加控制台输出 - 你应该能够很快找到它。
使用分析器。有很多种。这里是一个列表:http://java-source.net/open-source/profilers。例如,你可以使用 JIP,一个用 Java 编写的分析器。