JVM系列:如何使用jstack分析线程状态

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

当然一个正常的程序员不会写出上述代码,这里只是为了让一个线程占用较高的cpu资源。

top命令

在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序

 
 

1、上图中可以看出pid为23344的java进程占用了较多的cpu资源;
2、通过

top -Hp 23344

可以查看该进程下各个线程的cpu使用情况;

上图中可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。
 

jstack命令

通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态

jstack命令生成的thread dump信息包含了JVM中所有存活的线程,为了分析指定线程,必须找出对应线程的调用栈,应该如何找?

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。

参考地址:https://www.jianshu.com/p/6690f7e92f27

posted on 2019-01-09 21:12  腾飞的鹰  阅读(192)  评论(0)    收藏  举报

导航