当前位置:网站首页>Windows环境下如何进行线程Dump分析
Windows环境下如何进行线程Dump分析
2020-11-09 00:33:00 【java老k】
现在大部分公司都有自己完整的一套监控系统,比如美团的CAT,我们公司的监控系统也是基于CAT做的二次开发。一般测试环境或生产环境有问题可以直接使用这些系统查看线程和内存运行情况,分析排查问题。
但对于我们开发人员来说还是有必要了解最原始的排查流程,也就是不借助这些系统,使用最基本的命令解决,毕竟了解了这些底层实现对自身发展也是有帮助的。
网上搜下这样的文章其实很多,比如排查cpu过高,死锁问题的文章,但大部分讲的都是Linux环境下怎么做,其实很多问题在本地开发时就能发现和排查,所以我主要讲下 Windows 环境下如何排查,这里举例讲下java应用出现死锁问题的排查方法。
主要有两种方式,一种是使用JVM指令+Process Explorer工具,另一种是使用jdk/bin目录下的jvisualvm.exe工具
一. JVM指令+Process Explorer
常用JVM指令:
jps
主要用来输出jvm运行的进程状态jstack
查看某个java进程内的线程堆栈信息
全部命令可参考官方文档说明
Process Explorer是windows系统的进程管理器,可以查看对应pid(进程id)下的线程信息,方便定位到哪个线程占有的cpu资源高。
排查过程:
1. 打开Process Explorer工具,找到自己的java应用,如果不清楚出问题的java进程是哪个,可以在windows的cmd命令窗口里输入jps指令查看所有java应用的进程id,如图:
如果还不能确定哪个pid是你的java应用,可以加上 -lm 参数,
即:jps -lm
,打印出详细的类名,方便找到对应的pid
还有一种方式是在任务管理器(任务管理器-查看-选择列-pid)里也能找到对应的pid
2. 根据第一步找到的pid在Process Explorer工具找到那一行记录然后双击打开Thread一栏的tab,就能看的java进程pid对应的线程信息,TID就是对应的线程id,如图:
3. 在cmd命令行窗口使用jstack
指令把java应用的栈信息dump到本地分析,当然也可以直接在命令行窗口分析,但是一般堆栈信息都比较大,所有的线程信息都在里面,我们只关心出问题线程的堆栈信息,这样的话的可以使用: jstack pid|findstr tid
这个指令查找我们关心的线程id,但还是建议dump到本地查找,这里的tid要注意一下,jstack
里的线程id是用十六进制表示的,需要把第2步里的tid(十进制)转为十六进制,如图:
jstack指令后面的 -l 参数表示输出锁信息
- 打开dump文本文件,通过十六进制的tid找到对应的堆栈信息,就可以定位到具体的业务代码调用位置:
从上图可以看出出问题的代码是在DeadLockTest的70行,线程的状态是BLOCKED,因为dump线程时加上了 -l 的参数(jstack -l pid),所以在dump的最下方jvm会输出死锁的信息:
很明显Thread-1线程在等待0x000000076b940cf0这个锁,它本身持有0x000000076b940d00这个锁,而Thread-0刚好在等待0x000000076b940d00这个锁,它本身持有的锁是0x000000076b940cf0,这样成了两个线程互相等待对方手里持有的锁,导致了死锁的出现。
二. jvisualvm.exe工具
这个工具在JDK的安装目录的bin文件夹里,打开后也是找到对应的pid,它其实是访问我们JVM虚拟机里的堆栈信息,优点就是直观和方便查看线程运行情况,如果有死锁也会提示出来,如图:
文章来源:javakk.com/176.html
版权声明
本文为[java老k]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4630893/blog/4708410
边栏推荐
猜你喜欢
Copy the picture
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
Five design patterns frequently used in development
Fiddler无法正常抓取谷歌等浏览器的请求_解决方案
salesforce零基础学习(九十八)Salesforce Connect & External Object
Copy on write collection -- copyonwritearraylist
老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”
Database design: paradigms and anti paradigms
How does semaphore, a thread synchronization tool that uses an up counter, look like?
国内三大云数据库测试对比
随机推荐
How does semaphore, a thread synchronization tool that uses an up counter, look like?
The interface testing tool eolinker makes post request
Have you ever thought about why the transaction and refund have to be split into different tables
Constructors and prototypes
表连接
SQL语句的执行
简单介绍c#通过代码开启或关闭防火墙示例
如何通过Sidecar自定义资源减少Istio代理资源消耗
Database design: paradigms and anti paradigms
Salesforce connect & external object
Save code
App crashed inexplicably. At first, it thought it was the case of the name in the header. Finally, it was found that it was the fault of the container!
Swagger介绍和应用
数据库设计:范式与反范式
Chapter 5 programming
代码保存
CSP-S 2020 游记
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
object
Dynamic relu: Microsoft's refreshing device may be the best relu improvement | ECCV 2020