定位JAVA进程中异常线程的方法
日常使用中我们往往会遇到JAVA进程内存飙高,程序hang住,cpu的load过高等情况。这时候往往需要定位到JAVA的实例看下具体占用CPU、内存过高的线程都在做什么?
下面总结了下如何定位JAVA问题线程的方法。
找到有问题的JVM进程
linux命令:top–找到有问题的JAVA进程
shift+p 按照cpu排序
shift+m按照内存排序
查看有问题JAVA进程中的线程
linux命令:top -H -p pid 查看pid进程下所有有问题的线程
- 将十进制数换成16进制:printf “%x\n” tid
- 查看进程下的线程正在执行的方法: jstack pid |grep nid=0x【tid】 -A 30
jstack查看出来的线程信息梳理
线程的几种状态
- RUNNABLE,线程处于执行中
- BLOCKED,线程被阻塞
- WAITING,线程正在等待
对于锁的竞争,可参照下面的思路排查问题:
1 | 线程1获取到锁,处于RUNNABLE状态,线程2处于BLOCK状态; |
jmap查看JVM系统信息的命令
查找JVM中系统的大小和个数
1 | 按照个数统计 |
查看JVM中Heap的情况
1 | jmap -heap pid |
情况如下
1 | Attaching to process ID Pid, please wait... |