Java线程堆栈
- Linux jstack命令
jstack 7756(Java进程号) > java.stack
- Linux kill命令
kill -3 7756(Java进程号) 向JVM发送QUIT信号
Java线程
- JVM创建线程
- 用户线程
main函数代表主线程
- 线程堆栈的第一行
- 当一个线程占有一个锁时
堆栈会打印 -locked <Oxe7402c48>
- 当该线程等待别的线程释放该锁
堆栈会打印 -waiting to lock <Oxe7402c48>
- 如果代码中有wait调用
首先是locked 然后又会打印 waiting on <Oxe7402c48> 这种会导致死锁即死循环 占用了锁等待其他锁
线程死锁
0时刻 线程0获取锁0 线程1获取锁1 2时刻 线程0获取锁1 线程1获取锁0 两个线程各得到锁 都等待对方的锁
Java堆栈直接给出死锁的结果
死锁报错
死锁情况分析导致CPU过高分析
方法1
步骤
方法2 TOP&堆栈方法(一次命中)
5578是java的进程号 打印这个进程中所有线程 cpu消耗倒叙排列 shit+h jstack把线程堆栈打印出来 里面有很多线程 其中有一个就等于cpu消耗最多的那个pid 就可以直接定位到这行代码有问题
不消耗CPU的线程状态
- JVM的RUNNABLE状态
网络IO不消耗CPU 是同步阻塞的过程
- TIMED_WAITING(on object monitor)
obj.wait(time)
- TIMED_WAITING(sleeping)
Thread.sleep(time)
- TIMED_WAITING(parking)
被挂起
- WAITING(on object monitor)
obj.wait() 通过notify()唤醒
- BLOCKED (on object monitor)
等待监视锁
- WAITING(parking)
被挂起