Java VisualVM 中的“总时间(CPU)”是不是包含 CPU 用于执行其他进程的时间?

Posted

技术标签:

【中文标题】Java VisualVM 中的“总时间(CPU)”是不是包含 CPU 用于执行其他进程的时间?【英文标题】:does "total time (CPU)" in Java VisualVM contain time which CPU spent executing other processes?Java VisualVM 中的“总时间(CPU)”是否包含 CPU 用于执行其他进程的时间? 【发布时间】:2020-01-30 06:18:24 【问题描述】:

Java VisualVM 的 CPU 分析器选项卡中的“总时间 (CPU)”列是否包含 CPU 执行其他进程所花费的时间?

例如,让我们考虑这样的情况:

我运行一个程序,其中我有一个名为 myMethod() 的方法,它可以进行一些计算。这个计算需要 2 秒 - 所以如果 CPU 什么都不做,只执行我的代码,那么执行这个方法需要 2 秒。

在我分析我的应用程序时,CPU 正在执行多个进程 - 我的进程和其他一些进程(例如,我正在运行浏览器或类似的东西)。

CPU 已启动 myMethod(),它执行此方法一段时间,然后开始执行浏览器进程并在那里花费 1 秒,然后再次返回执行 myMethod() 并完成。所以在 myMethod() 的开始和结束之间已经过去了 3 秒,但只有 2 秒用于执行 myMethod()。

Java VisualVM 的 CPU 分析器选项卡中的“总时间 (CPU)”列中显示的时间是 2 秒还是 3 秒?

【问题讨论】:

【参考方案1】:

在报告 CPU 时间时,分析器将报告 JVM 本身花费的时间(可能包括“系统”时间)。

(比如说)浏览器使用的 CPU 时间不应计入 CPU 时间列。如果是 / ,那么列标题应该是“经过”或“实时”时间。

如果您对此没有信心,请编写一些简单的测试程序并对其进行分析:

查看分析器在您的应用程序调用Thread.sleep(....)时报告的内容

当您的应用程序在从System.in 读取一行时出现阻塞时,查看分析器报告的内容。

【讨论】:

以上是关于Java VisualVM 中的“总时间(CPU)”是不是包含 CPU 用于执行其他进程的时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 visualvm 中的“总时间”列与运行时持续时间不同?

如何告诉 visualvm 在哪里可以找到我的源代码?

Java性能调优:利用VisualVM进行性能分析

Java虚拟机性能管理神器 - VisualVM 入门

Java VisualVM 插件地址

JVM探秘:VisualVM监控远程Java进程