使用jstack命令分析线程状态

来源:互联网 发布:知乎福利收藏夹 编辑:程序博客网 时间:2024/05/16 00:49


    系统调优,看到CPU一直满的,一定是代码不符合规范了。怎样去定位代码问题,如何查看占用CPU较高的线程呢?


1.top命令

     在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序。 这样可以查看到进程的PID,我们通过PID进一步查看每个进程 。


2.通过top -Hp PID 

      可以查看该进程下各个线程的cpu使用情况。可以看出哪个PID的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。


3.jstack命令

     通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态。jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈。

     在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别。


4.通过thread dump分析线程状态

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

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