首页 > 解决方案 > 为什么 gtime 命令为没有多线程的 java 程序返回 CPU 使用率 > 100%?

问题描述

我尝试使用 gtime 命令(我相信这是 Mac OSx 等效于 Unix time 命令)来获取 java 程序的执行时间。但结果似乎令人困惑:

  1. 即使程序没有产生任何线程,CPU 使用率也显示 >100%。
  2. 即使我的代码中没有多线程,实时也远低于用户时间。

这是我得到的:

> gtime java 主要

7.36user 0.29system 0:02.11elapsed 362%CPU (0avgtext+0avgdata 306264maxresident)k 0inputs+0outputs (273major+114934minor)pagefaults 0swaps

如您所见,CPU 使用率为 362%,用户时间(7.36 秒)>> 实时(2.11 秒)。谁能解释为什么会这样?我正在使用具有 Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz(4 核)处理器的 Macbook Pro。

附带说明一下,在 Java 中运行“hello world”程序也会返回 >100% 的 CPU 使用率。

> gtime java HelloWorld

你好世界!0.14user 0.04system 0:00.14elapsed 124%CPU (0avgtext+0avgdata 33668maxresident)k 0inputs+0outputs (0major+10288minor)pagefaults 0swaps

标签: javaunixtime

解决方案


即使您运行一个简单的main()程序,JVM 也会启动多个后台线程。这些线程正在执行 JIT 编译、RMI 处理、对象终结或其他系统任务。您可以通过手动调试或进行线程转储来查看这些线程。其次,当今使用的大多数垃圾收集器实现要么是并行的,要么是多线程的(或两者兼有),并将尝试使用所有可用的 CPU 内核来缩短 GC 暂停。

以上所有情况都会导致 JVM 使用多个 CPU 内核。大多数工具会将此报告为超过 100% 的 CPU 利用率。


推荐阅读