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

10

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

我想找出在此期间执行的代码的哪个部分(假设这是我的问题)。

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

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


谢谢大家!顺便说一下,我正在使用 Eclipse。 - jjnguy
12个回答

12
这被称为“分析”。您的集成开发环境可能会带有一个:请参见Java开源分析器

3

使用性能分析工具(例如yourkit


2

你能写一些关于如何使用TPTP的技巧吗?那将是非常宝贵的! - André Chalella

2
简而言之,性能分析工具将告诉您程序的哪个部分被调用了多少次。
我不经常对我的程序进行性能分析,所以我没有太多的经验,但当我测试NetBeans IDE时,我玩过它的性能分析器。 (我通常也使用Eclipse。我还将研究Eclipse中的性能分析功能。)
NetBeans性能分析器将告诉您哪个线程执行了多长时间,并调用了哪些方法,还会给您条形图显示每个方法所花费的时间。这应该可以让您知道哪个方法有问题。如果您感兴趣,可以查看NetBeans IDE提供的Java性能分析器
性能分析是一种通常用于测量程序中哪些部分占用了大量执行时间的技术,从而可以用于评估是否执行优化有助于提高程序的性能。
祝你好运!

1

这是一个典型的'高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

1) 这是你的错 :)

2) 如果你正在使用Eclipse或Netbeans,请尝试使用分析功能 - 它应该很快告诉你代码花费了大量时间的地方。

3) 如果还不行,在你认为内部循环的位置添加控制台输出 - 你应该能够很快找到它。


1

是的,有这样的工具:你需要对代码进行分析。你可以尝试在Eclipse中使用TPTP或者尝试JProfiler。这将让你看到正在调用什么以及频率如何。


1

1

1
如果您正在使用Sun Java 6,则最新的JDK版本附带JVisualVM在bin目录中。这是一个功能强大的监控和分析工具,使用起来非常简单 - 您甚至不需要使用特殊参数启动程序 - JVisualVM只需列出所有当前运行的Java进程,然后您选择要操作的进程即可。
此工具将告诉您哪些方法正在使用所有处理器时间。
虽然有很多更强大的工具可用,但首先尝试免费的工具。然后,当您了解其他可用功能时,您就会对它们如何帮助您有所了解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接