线上问题定位---jstack
1、通过top 拿到占用cpu比较高的几个进程的pid ,如A
2、top -Hp A:找出占用cpu过高的线程,记录下PID 如1,2,转换成十六进制。printf "%x\n" 21742,如b
3、jstack -l A>test.txt 在test.txt文档中找b相关的信息就行分析
- 死锁,Deadlock(重点关注)
- 执行中,Runnable
- 等待资源,Waiting on condition(重点关注)
- 等待获取监视器,Waiting on monitor entry(重点关注)
- 对象等待中,Object.wait() 或 TIMED_WAITING
- 暂停,Suspended
- 阻塞,Blocked(重点关注)
- 停止,Parked
Runnable
线程正在运行中。一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
Deadlock
同一个地址被不同线程占用。
Wait on condition
等待资源,或等待某个条件的发生。具体原因需结合 stacktrace来分析。
-
常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。关键字:
TIMED_WAITING
,sleeping
,parking
。TIMED_WAITING可能是调用了有超时参数的wait所引起的。parking指线程处于挂起中。
下面是一个典型的sleep引起的Wait on condition
。
Blocked
线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
如果线程处于Blocked状态,但是原因不清楚。可以使用jstack -m pid
得到线程的mixed信息。
参考:https://blog.csdn.net/bluetjs/article/details/78040571