通常服务进程没有挂掉的情况下可以使用如下命令
1.在线输出线程栈到文件,进行离线分析
1.1 输出线程栈信息到jstack.log 然后重启服务,继续分析线程栈文件
# java进程正在运行 输出线程栈到文件
jstack -l pid >jstack.log
# java进程已经hung process 输出线程栈到文件
jstack -F -l pid >jstack.log
# 根据线程状态关键字过滤
cat jstack.log|grep lock -C20
1.2 关注的线程状态
死锁-Deadlock(重点关注)
阻塞-Blocked(重点关注)
等待资源-Waiting on condition(重点关注)
等待获取监视器-Waiting on monitor entry(重点关注)
执行中-Runnable
暂停-Suspended
对象等待中-Object.wait() 或 TIMED_WAITING
停止-Parked
1.3 类似的输出结果,表示存在死锁
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f0134003ae8 (object 0x00000007d6aa2c98, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f0134006168 (object 0x00000007d6aa2ca8, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at javaCommand.DeadLockclass.run(JStackDemo.java:40)
- waiting to lock <0x00000007d6aa2c98> (a java.lang.Object)
- locked <0x00000007d6aa2ca8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
"Thread-0":
at javaCommand.DeadLockclass.run(JStackDemo.java:27)
- waiting to lock <0x00000007d6aa2ca8> (a java.lang.Object)
- locked <0x00000007d6aa2c98> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
2.对线程栈在线分析
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message