Java性能分析:检测哪段代码导致高CPU负载

10

我使用了JProfiler和YourKit对我的代码进行了剖析,但是我无法弄清楚哪段代码导致了高CPU负载。

如果响应时间很糟糕,那么检测热点就很容易。但在我的情况下,响应时间并不是问题,只是在处理特定请求的短时间内 CPU 负载非常高(令人惊讶地高)。

我该如何确定哪些类/方法导致了这个问题?我想找到一种列出方法处理所需的 CPU 循环数的列表或类似的东西。


1
方法热点是我会查找的地方。您不相信这个结果的原因是什么?当执行请求时,您是否期望CPU达到100%(或至少一个完整的核心)? - Peter Lawrey
是的,当然你是对的。测量CPU周期数和测量执行时间是直接相关的,因为[执行时间=(周期数*每个周期的时间)+ I/O等待时间]。 - Marcel Stör
2个回答

7
CPU负载基本上表示CPU周期的数量,其中CPU有事情要做而不是只是虚拟地打转手指。
因此,如果您的请求实际上正在执行真正的工作(而不是等待磁盘I/O),则可以预期在工作正在进行时负载会变高,因为CPU有事情要做。
您需要寻找的是CPU周期耗尽,因为这是响应时间开始上升的时候。
如果您在这里的问题是请求太短,以至于分析器无法显示您需要看到的内容,请考虑使用自动化工具来要求其处理成千上万个请求。 这应该会有所帮助。

1
而不是只是虚拟地闲逛。 +1 - Eugene

2
当进程正在处理时,它的进度为100%。当它在等待(例如等待I/O)时,进度为0%。没有中间值。如果一个进程的进度小于100%,那是对过去N毫秒的滚动平均值。
如果有一种方法可以使其更有效率,那将使其花费更少的时间,而不一定是百分比更少。
如果您想找到一种使其花费更少时间的方法,请给它充分的工作负载并尝试这个

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