java - 为什么 gtime 命令为没有多线程的 java 程序返回 CPU 使用率 > 100%?
问题描述
我尝试使用 gtime 命令(我相信这是 Mac OSx 等效于 Unix time 命令)来获取 java 程序的执行时间。但结果似乎令人困惑:
- 即使程序没有产生任何线程,CPU 使用率也显示 >100%。
- 即使我的代码中没有多线程,实时也远低于用户时间。
这是我得到的:
> 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
解决方案
即使您运行一个简单的main()
程序,JVM 也会启动多个后台线程。这些线程正在执行 JIT 编译、RMI 处理、对象终结或其他系统任务。您可以通过手动调试或进行线程转储来查看这些线程。其次,当今使用的大多数垃圾收集器实现要么是并行的,要么是多线程的(或两者兼有),并将尝试使用所有可用的 CPU 内核来缩短 GC 暂停。
以上所有情况都会导致 JVM 使用多个 CPU 内核。大多数工具会将此报告为超过 100% 的 CPU 利用率。
推荐阅读
- c++ - 在特定的儿童情况下未能渗透到 MIN 二元堆
- angular - @angular-redux/store:如何为 redux store 编写单元测试?
- css - React Web 导航栏树形菜单激活
- python - 如何将字符串添加到列表的每个值,然后使该字符串的值向上计数?
- vue.js - 带有 scss prependData @import 的 Vue cli 页面未导入到所有页面
- javascript - 为什么调用 Javascript 文件中一个 Javascript 文件的结果“未定义”?
- android - 有没有办法根据服务器查询发送通知或文本?
- github - 停止已在 GitHub Actions 中运行的工作流/作业
- ios - 使用 Tab 栏在两个视图控制器之间传递时 TableView 未更新
- batch-file - 如何使用命令提示符或批处理禁用 FTP 服务?