【问题标题】:Thread.run takes lots CPU time in profiler logThread.run 在分析器日志中占用大量 CPU 时间
【发布时间】:2017-08-29 20:13:16
【问题描述】:

我在性能方面遇到了具体问题,因此开始分析我的应用程序,我在 Jprofiler 中看到了奇怪的统计数据 - Thread.run 在调用树分析中拥有高达 20% 的 CPU 时间,并且进行内部调用并不代表他的时间(大部分接近 0%)。似乎线 Thread.run 本身需要 20%..

这是什么意思,可能某处是线程创建的开销?请指教

【问题讨论】:

  • 你在运行方法中的某个地方有旋转等待吗?
  • Thread.run 没有做任何事情,这很可能是分析器中的帐户错误。我所知道的任何探查器都不会测量线程创建的开销,因为它在线程启动之前发生在本机代码中。您是否正在创建许多非常短暂的线程?如果是这样,请改用线程池。这些天我很少直接创建线程,创建线程池即使只有一个。
  • @PeterLawrey 这不是错误,它只是与过滤器配置有关。 run 方法总是被分析,直到第一个匹配调用树过滤器配置的类都成为 run 方法的 self time 的一部分。
  • @PeterLawrey 也许我必须改写一下:时间来自线程入口点和根据过滤器设置分析的第一个类之间的类。想想一个 servlet 引擎和实际的 servlet 实现。如果 servlet 引擎的类被过滤,在容器中花费的时间将最终在 Thread.run 方法中。
  • @PeterLawrey 这实际上是一个常见的混淆源,所以我将在 Thread.run 方法旁边添加一个帮助图标来解释这种情况

标签: java multithreading profiling jprofiler


【解决方案1】:

线程调用的run方法总是被分析,不管Runnable的类是否被分析。

从那时起,直到第一个类与调用树过滤器配置匹配的所有内容都成为 run 方法的自身时间的一部分。

要查看所有类,请使用“采样”作为调用树记录方法,并在分析设置中选中“采样”设置旁边的“禁用所有过滤器”复选框。

【讨论】:

  • 虽然正确,但这并不能解释在 null 条件下和方法调用如何使用高百分比的 cpu。
  • 在我看来,这只是对阅读分析结果的困惑。一旦我们看到代码和分析器的屏幕截图,我们就会更好地了解
  • @PeterLawrey 请看我上面的评论
  • 将上面的截图添加到帖子中
  • @Fagoter 截图显示这绝对是你的过滤器设置。在 Runnable 和您在 Thread.run 下面的第一级中看到的类之间有一个框架或容器。
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2012-03-26
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多