JAVA死锁的检测流程
步骤一. 查询检测的进程
1.首先查看系统资源占用信息,TOP看一下
USER 进程所属用户 PID 进程ID %CPU 进程占用CPU百分比 %MEM 进程占用内存百分比 VSZ 虚拟内存占用大小 单位:kb(killobytes) RSS 实际内存占用大小 单位:kb(killobytes) TTY 终端类型 STAT 进程状态 START 进程启动时刻 TIME 进程运行时长 COMMAND 启动进程的命令
发现正在运行的JAVA项目CPU占用率很高,百分之360左右了,那么问题一定出在这个程序中
2 .也可以通过名称查询进程pid
步骤二. 查询检测的线程
ps -mp pid -o THREAD,tid,time
ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -n -r | less
pmem: 内存使用
pcpu: cpu使用
RSS 实际内存占用大小
VSZ 虚拟内存占用大小
args 参数信息
找到占用时间长的线程
通过工具把线程转成16进制,linux里面可以用自带的printf,eg. printf "%x\n" 22295
步骤三. 查询线程的状态
jstack 21912|grep 5717 -A 30
在dump中,线程一般存在如下几种状态:
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞
3、WAITING,线程正在等待
4、TIMED_WAITING,这个一般是指这个线程是Timer定期执行任务,但是当前处于waiting状态
再结合代码分析具体的问题