距离上一次更新该文章已经过了 699 天,文章所描述的內容可能已经发生变化,请留意。
使用top命令定位异常进程。找到CPU和内存占用率都非常高的
pid
,假设为11268top
此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为11268的进程,可以查看是哪个应用占用的该进程。
ps -ef|grep java
使用top -H -p 进程号查看异常线程,(
-H
: 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。)top -H -p 11268
使用printf "%x\n" 线程号将异常线程号转化为16进制,假设异常线程为11422
printf "%x\n" 11422
->2c9e
使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(-A90是指输出的日志行数)。可以看到异常代码的位置。
jstack 11268|grep 2c9e -A90
介绍
top命令
在linux环境下,可以通过top
命令查看各个进程的cpu使用情况,默认按cpu使用率排序
通过
top -Hp可以查看该进程下各个线程的cpu使用情况;
jstack命令
通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid
命令查看当前java进程的堆栈状态
jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,然后再对应nid查看分析问题
plaintext
1 | 大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!