You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VisualVM显示休眠线程CPU占用100%的原因排查

问题原因分析

关于java.io.BufferedReader.readline()线程显示100%CPU的问题

  • 这个线程是IntelliJ代理用来读取程序控制台输出的辅助线程。当它调用readline()等待I/O时,在部分操作系统和JVM版本组合下,JVM会把这种阻塞I/O的线程标记为RUNNABLE状态,而非预期的WAITING。VisualVM的CPU采样统计是基于JVM上报的线程状态计算占比的——只要线程处于RUNNABLE状态,就会被算作"正在占用CPU",哪怕它实际只是在等待I/O、没消耗任何CPU周期。而你的测试程序实际只有main线程在周期性占用1核,所以系统总CPU占比约50%,和VisualVM的线程采样统计出现了偏差。

关于RMI等线程显示绿色运行状态的问题

  • RMI相关线程(如RMI Connection、RMI Registry)大多时候处于等待远程请求的状态,但底层实现中,这类等待依赖socket阻塞调用时,JVM同样可能把该状态上报为RUNNABLE。VisualVM的Threads标签里绿色代表RUNNABLE状态,所以会显示成"运行中",但实际上这些线程并没有执行计算逻辑,只是在等待外部请求或I/O事件,本质属于休眠类状态。

额外说明

  • IntelliJ的javaagent会注入多个辅助线程实现控制台交互、程序监控等功能,这些线程的阻塞行为在JVM状态上报中的表现和普通应用线程不同,这是导致VisualVM统计偏差的核心原因。如果要获得更准确的线程状态和CPU统计,可以尝试直接用java命令启动程序,不通过IntelliJ的代理,再用VisualVM连接。

内容的提问来源于stack exchange,提问作者sha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:16