• 使用top命令定位异常进程。找到CPU和内存占用率都非常高的pid,假设为11268

    top

  • 此时可以再执行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查看分析问题

1
2
3
4
5
6
大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

在dump中,线程一般存在如下几种状态:
1、RUNNABLE,线程处于执行中
2、BLOCKED,线程被阻塞
3、WAITING,线程正在等待

结合此工具,堆栈日志分析