当前位置:网站首页>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
边栏推荐
- Programmers should know the URI, a comprehensive understanding of the article
- The vowels in the inverted string of leetcode
- B. protocal has 7000eth assets in one week!
- STC转STM32第一次开发
- When we talk about data quality, what are we talking about?
- 梁老师小课堂|谈谈模板方法模式
- LeetCode-15:三数之和
- Swagger介绍和应用
- Five design patterns frequently used in development
- 上线1周,B.Protocal已有7000ETH资产!
猜你喜欢

简单介绍c#通过代码开启或关闭防火墙示例

Tasks of the first week of information security curriculum design (analysis of 7 instructions)

Tips in Android Development: requires permission android.permission write_ Settings solution

几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!

STC转STM32第一次开发

C/C++编程笔记:指针篇!从内存理解指针,让你完全搞懂指针

Salesforce connect & external object

架构中台图

梁老师小课堂|谈谈模板方法模式

选择API管理平台之前要考虑的5个因素
随机推荐
Test comparison of three domestic cloud databases
Five factors to consider before choosing API management platform
Pipedrive如何在每天部署50+次的情况下支持质量发布?
LeetCode-15:三数之和
Huawei HCIA notes
Queue with two stacks
梁老师小课堂|谈谈模板方法模式
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!
数据库设计:范式与反范式
centos7下安装iperf时出现 make: *** No targets specified and no makefile found. Stop.的解决方案
Database design: paradigms and anti paradigms
简单介绍c#通过代码开启或关闭防火墙示例
How does semaphore, a thread synchronization tool that uses an up counter, look like?
链表
C/C++编程笔记:指针篇!从内存理解指针,让你完全搞懂指针
Combine theory with practice to understand CORS thoroughly
代码保存
平台商业化能力的另一种表现形式SAAS
android开发中提示:requires permission android.permission write_settings解决方法
Programmers should know the URI, a comprehensive understanding of the article