本地虚拟机非GUI模式执行测试时CPU占用率过高问题
非GUI模式JVM占满CPU问题排查方案
本地虚拟机配置为16GB内存、双核处理器,10个vuser测试场景下:
- 非GUI模式CPU占用率100%,资源全被JVM占用,任务管理器无法定位具体原因
- GUI模式下CPU仅占60%
- 同配置旧虚拟机无此问题,仅新虚拟机出现异常
排查步骤
1. 对比JVM启动参数
- 检查新旧虚拟机的JVM参数差异,重点关注:
- 非GUI模式是否启用了
-XX:+UseParallelGC这类CPU密集型垃圾收集器,而旧虚拟机用的是CMS/G1等低CPU开销的GC - 堆内存配置(
-Xmx/-Xms)是否一致,新虚拟机堆内存分配不合理可能引发频繁GC - 是否存在非GUI专属参数,比如禁用图形优化时意外开启了CPU消耗型任务
- 非GUI模式是否启用了
2. 线程级CPU定位
- 用工具定位高CPU线程:
Windows可使用Process Explorer查看线程CPU占用,结合# Linux环境 top -H -p <JVM进程ID> # 找到占用CPU最高的线程ID(十进制) printf "%x\n" <线程ID> # 转十六进制 jstack <JVM进程ID> | grep -A 10 <十六进制线程ID> # 查看线程栈jstack导出栈信息。重点排查是否存在无限循环、死锁或高频线程切换——非GUI模式缺少GUI线程的调度限制,可能导致后台线程无限制占用CPU。
3. 验证测试脚本与依赖
- 确认新旧虚拟机的测试脚本、依赖库版本完全一致:
- 非GUI模式是否加载了额外的日志、监控插件,导致CPU开销激增
- 脚本中是否有依赖GUI环境的逻辑,在非GUI模式下触发错误重试或循环
4. 系统层面差异检查
- 核对新旧虚拟机的系统配置:
- JDK版本、内核版本是否一致,新虚拟机可能用了兼容性差的JDK(如OpenJDK与Oracle JDK差异)
- CPU亲和性设置,是否非GUI模式下虚拟机CPU被绑定到单个核心
- 是否开启了虚拟机动态资源调整(如VMware自动CPU分配),导致非GUI模式资源分配异常
5. GC日志分析
- 开启GC日志:
对比GUI与非GUI模式的GC频率:# 添加到JVM启动参数 -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps- 非GUI模式是否频繁触发Young GC或Full GC,这会持续占用CPU
- 堆内存新生代/老年代比例是否合理,配置不当会加剧GC压力
内容的提问来源于stack exchange,提问作者Bhaskara Reddy Dwarampudi
相关产品推荐
相关产品推荐

