一、Linux下查看进程和线程的CPU消耗动态情况
现代Linux是具有“进程-线程体系结构”的操作系统。
1.1、查看进程的CPU消耗动态情况
在Linux中,可通过top -p 进程A的ID
命令查看进程A的CPU消耗动态情况,此时“PID”列显示的是:进程ID。
1.2、查看线程的CPU消耗动态情况
在Linux中,可通过top -Hp 进程A的ID
命令查看进程A内所有线程的CPU消耗动态情况,此时“PID”列显示的是:线程ID。
Java进程也是Linux进程,因此可通过top -Hp 进程A的ID
命令完美解决“Linux下如何定位Java进程内CPU消耗最多的Java线程”这个问题。
备注:
1、top命令涉及到的进程和线程皆为“进程-线程体系结构”中的原生进程和原生线程
2、Linux下,Java线程直接对应于Linux原生线程
二、查看Java进程内CPU消耗最多Java线程的即时运行状况
JDK提供“jstack”命令用于查看Java进程内Java线程的即时运行状况。
执行jstack Java进程A的ID
获取用于描述“Java进程A内所有Java线程的即时运行状况”的jstack栈,一个栈帧对应于一个Java线程的即时运行状况描述,栈帧中有一个“nid”字段,该字段的全称为“native thread id”,即原生线程ID(可佐证“Java线程对应于原生线程”),因此,可直接根据CPU消耗最多Java线程的线程ID定位到相应栈帧,查看该Java线程的即时运行状况。
需要注意的是,top -Hp 进程A的ID
命令中得到的线程ID(PID列值)是十进制的,而jstack栈帧中的线程ID(nid字段值)是十六进制且是小写形式的,因此,在匹配前需要进行转换,比如通过printf "%x\n" 十进制线程ID
或者printf "%d\n" 十六进制线程ID
命令。