爪哇:如何查看代码的哪些部分运行最多?(分析)
-
01-07-2019 - |
题
我正在用 Java 编写一个简单的跳棋游戏。当我将鼠标悬停在主板上时,我的处理器性能提升至 50%(核心上为 100%)。
我想找出我的代码的哪一部分(假设是我的错)在此期间正在执行。
我尝试过调试,但在这种情况下逐步调试效果不太好。
有没有什么工具可以告诉我问题出在哪里?我目前正在使用 Eclipse。
解决方案
这称为“分析”。您的 IDE 可能附带一个:看 Java 中的开源分析器.
其他提示
使用分析器(例如 你的工具包 )
分析?我不知道你用的是什么IDE,但是 Eclipse 有一个不错的分析器 还有一些开源分析器的列表,位于 java源代码.
简而言之, 分析器 会告诉您程序的哪一部分被调用的频率是多少。
我不太了解我的程序,所以我没有太多经验,但我已经尝试过 NetBeans 集成开发环境 当我测试它时。(我通常也使用Eclipse。我还将研究 Eclipse 中的分析功能。)
NetBeans 分析器会告诉您哪个线程执行了多长时间,以及调用了哪些方法多长时间,并且会提供条形图来显示每个方法花费了多少时间。这应该会提示您哪个方法导致了问题。你可以看看 Java 分析器 如果您好奇的话,NetBeans IDE 提供了这些信息。
分析是一种通常用于测量程序的哪些部分占用大量执行时间的技术,进而可用于评估执行优化是否有利于提高程序的性能。
祝你好运!
1)这是你的错:)
2) 如果您使用的是 eclipse 或 netbeans,请尝试使用分析功能——它应该很快告诉您代码在哪里花费了大量时间。
3)如果失败,请在您认为内部循环所在的位置添加控制台输出——您应该能够快速找到它。
使用分析器。有许多。这是一个列表: http://java-source.net/open-source/profilers. 。例如你可以使用 联合工业计划, ,一个java编码的分析器。
如果您使用的是 Sun Java 6,则最新的 JDK 版本附带 JVisualVM 在 bin 目录中。这是一个功能强大的监视和分析工具,使用起来只需很少的努力 - 您甚至不需要使用特殊参数启动程序 - JVisualVM 只需列出所有当前正在运行的 java 进程,您就可以选择要使用的进程。
该工具将告诉您哪些方法正在使用所有处理器时间。
有很多更强大的工具,但首先使用免费的工具。然后,当您了解其他可用功能时,您就会了解它们如何为您提供帮助。
这是典型的“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% 的情况下,我们将能够使用线程转储来识别。
或者对您的一些常见组件使用 JUnit 测试用例和代码覆盖工具。如果有组件调用其他组件,您很快就会看到这些组件被执行了很多次。
我将 Clover 与 JUnit 测试用例一起使用,但对于开源,我听说 EMMA 相当不错。
在单线程代码中,我发现添加了一些如下语句:System.out.println("A:“+ System.currentTimeMillis());与使用分析器一样简单且有效。您很快就可以缩小导致问题的代码部分的范围。