thread

参数说明

参数名称 参数说明
id 线程id
[n:] 指定最忙的前N个线程并打印堆栈
[b] 找出当前阻塞其他线程的线程
[i <value>] 指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200
[–all] 显示所有匹配的线程

cpu使用率是如何统计出来的?

这里的cpu使用率与linux 命令top -H -p <pid> 的线程%CPU类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。

工作原理说明:

  • 首先第一次采样,获取所有线程的CPU时间(调用的是java.lang.management.ThreadMXBean#getThreadCpuTime()sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()接口)
  • 然后睡眠等待一个间隔时间(默认为200ms,可以通过-i指定间隔时间)
  • 再次第二次采样,获取所有线程的CPU时间,对比两次采样数据,计算出每个线程的增量CPU时间
  • 线程CPU使用率 = 线程增量CPU时间 / 采样间隔时间 * 100%

注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。

另外一种查看Java进程的线程cpu使用率方法:可以使用show-busy-java-threads这个脚本

  • 没有线程ID,包含[Internal]表示为JVM内部线程,参考dashboard命令的介绍。
  • cpuUsage为采样间隔时间内线程的CPU使用率,与dashboard命令的数据一致。
  • deltaTime为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。
  • time 线程运行总CPU时间。

注意:线程栈为第二采样结束时获取,不能表明采样间隔时间内该线程都是在处理相同的任务。建议间隔时间不要太长,可能间隔时间越大越不准确。 可以根据具体情况尝试指定不同的间隔时间,观察输出结果。

demo

  • thread -i 1000 : 统计最近1000ms内的线程CPU时间。
  • thread -n 3 -i 1000 : 列出1000ms内最忙的3个线程栈
  • thread –state ,查看指定状态的线程

文章作者: 凌云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 凌云 !
 上一篇
2023-04-24 凌云
下一篇 
2023-04-24 凌云
  目录