一, 应用场景:
当 Linux 服务器出现异常情况 (响应缓慢, 负载持续飙升) 并且服务器没有安装对应的包而无法使用 jstack 等命令时, 可以使用 Linux 的 kill 相关命令打印堆栈信息.
命令格式: kill -3 PID
二, 执行步骤:
2.1, 获取 java 进程的 PID
ps -ef|grep java
结果的第二列数字就是进程对应的 pid.
2.2,kill -3 PID
(1)如果项目通过 Tomcat 进行发布(普通的 web 项目), 则对应的堆栈信息会打印在 catalina.out 文件中.
(2)如果项目是基于 SpringBoot 并且使用 nohup java -jar xxx.jar & 命令运行, 则 java 堆栈信息会在 jar 包所在的 nohup.out 文件中.
三, 查看堆栈信息
以 nohup.out 文件为例:
3.1,cd 命令进入 SpringBoot jar 包所在的目录
3.2,VIM nohup.out 命令打开文件
3.3, 按 Shift+G 快捷键跳到文件的末尾, 再连续按 Ctrl+B, 直到向上翻页找到堆栈信息(有 java.lang.Thread.State 关键字)
或者直接输入 / java.lang.Thread.State 再按 Enter 键, 就可以高亮出关键字, 再按 N 键, 可以遍历查看.
VIM 常用翻页快捷键如下:
[Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down] 按键 (常用) |
[Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕『向下』移动半页 |
[Ctrl] + [u] | 屏幕『向上』移动半页 |
注: kill -3 PID 命令只能打印那一瞬间 java 进程的堆栈信息, 适合在服务器响应慢, CPU, 内存快速飙升等异常情况下使用, 可以方便地定位到导致异常发生的 java 类, 解决如死锁, 连接超时等原因导致的系统异常问题. 该命令不会杀死进程.
来源: https://www.cnblogs.com/stm32stm32/p/10427618.html