共计 1506 个字符,预计需要花费 4 分钟才能阅读完成。
当初大部分公司都有本人残缺的一套监控零碎,比方美团的 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 虚拟机里的堆栈信息,长处就是直观和不便查看线程运行状况,如果有死锁也会提醒进去,如图:
文章起源:http://javakk.com/176.html