1.top
在服务器上,我们可以通过top命令查看各个进程的cpu使用情况,它默认是按cpu使用率由高到低排序的
由上图中,我们可以找出pid为21340的java进程,它占用了最高的cpu资源
2. top -Hp pid
通过top -Hp 21340可以查看该进程下,各个线程的cpu使用情况,如下
3. jstack pid
通过top命令定位到cpu占用率较高的线程之后,接着使用jstack pid命令来查看当前java进程的堆栈状态, jstack21350
后,内容如下:
在thread dump中,每个线程都有一个nid,我们找到对应的nid(5366),发现一直在跑(24行)
4. jstack -l [PID] >/tmp/log.txt
其实,前3个步骤,堆栈信息已经出来啦。但是一般在生成环境,我们可以把这些堆栈信息打到一个文件里,再回头仔细分析哦~
Dump 文件分析关注重点
runnable,线程处于执行中
deadlock,死锁(重点关注)
blocked,线程被阻塞 (重点关注)
Parked,停止
locked,对象加锁
waiting,线程正在等待
waiting to lock 等待上锁
Object.wait(),对象等待中
waiting for monitor entry 等待获取监视器(重点关注)
Waiting on condition,等待资源(重点关注),最常见的情况是线程在等待网络的读写