当前位置:网站首页>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
边栏推荐
猜你喜欢

Python的特性与搭建环境

How does semaphore, a thread synchronization tool that uses an up counter, look like?

Programmers should know the URI, a comprehensive understanding of the article

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

Core knowledge of C + + 11-17 template (2) -- class template

LeetCode-15:三数之和

Are there many Python application scenarios?

Introduction and application of swagger

leetcode之反转字符串中的元音字母

Platform in architecture
随机推荐
Factory pattern pattern pattern (simple factory, factory method, abstract factory pattern)
salesforce零基础学习(九十八)Salesforce Connect & External Object
The vowels in the inverted string of leetcode
LeetCode-15:三数之和
架构中台图
Realization of file copy
你有没有想过为什么交易和退款要拆开不同的表
如何让脚本同时兼容Python2和Python3?
The vowels in the inverted string of leetcode
When iperf is installed under centos7, the solution of make: * no targets specified and no makefile found. Stop
Factory Pattern模式(简单工厂、工厂方法、抽象工厂模式)
AQS 都看完了,Condition 原理可不能少!
SAP S/4HANA 2020安装实录
Tips in Android Development: requires permission android.permission write_ Settings solution
14. Introduction to kubenetes
Linked blocking queue based on linked list
The interface testing tool eolinker makes post request
移动大数据自有网站精准营销精准获客
Five phases of API life cycle
Concurrent linked queue: a non blocking unbounded thread safe queue