jstack使用
jstack是打印JVM线程快照的命令,用于查看当前各线程正在执行的堆栈。
jstack用法上分两步:
1 2 3 4 |
|
输出的内容格式如下图所示:
线程状态有NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED五种,在排查问题时主要关注BLOCKED、RUNNABLE、WAITING。BLOCKED状态是发生了死锁,从堆栈中可以找到此线程是在等待哪把锁,然后再看这把锁是被哪个线程给获取了,为什么这个线程获取锁有没有释放,这样一个流程下来基本可以定位问题。RUNNABLE状态是正在运行的线程,如果有大量正在运行的线程而且堆栈都指向同一个或同一类地方,那就要考虑是否是有代码执行过慢,另外,从线程名称可以区分出是否是tomcat线程,一般tomcat的最大线程数为768,如果发现达到了这个数字,需要考虑是否并发太高,应用已无法及时响应。WAITING状态一般不会去关注,但是当有大量tomcat线程是此状态时,那就需要排查一下原因了,因为如上所述,tomcat线程数是有最大值的,如果超出了最大值,请求就只能排队等待,而过多的WAITING状态的tomcat线程势必导致可用的tomcat线程数减少,影响应用的正常使用。
输出的内存快照文件除了直接用文本编辑器查看外,还可以使用JCA查看,而且目前我基本是先用JCA查看,排查不出原因后再用文本编辑器查看。