如何使用原生top命令、jstack命令来做定位具体代码的位置处理
top
top -Hp 7
printf '%x\n' 33264
81f0
printf '%x\n' 30633
77a9
jstack -l 7 > ./jstack_result.log
打包文件
tar -cvf jstack_result.tar jstack_result.log
?
cat jstack_result.log |grep -A 200 'nid=0x6a'
可以看到我们已经找到了 nid 为 0x6a的堆栈信息,接着只要仔细分析一番即可。
当然更常见的是我们对整个 jstack 文件进行分析,通常我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用说了。
WAITING:进入等待状态,
使用方式:wait/join/park方法进入无限等待,通过notify/notifyAll/unpark唤醒;
TIMED_WAITING:与WAITING类似,
使用方式:
a. 给定等待时间的wait/join/park方法;
b. sleep方法;
BLOCKED:被动进入等待状态,使用方式进入Synchronized块;
顺便补下之前关于线程等待两种方式的区别:
cat jstack_result.log | grep "java.lang.Thread.State" | sort -nr | uniq -c
Object.wait() 和 Thread.sleep() 区别:
我们可以使用命令 cat jstack_result.log ?| grep "java.lang.Thread.State" | sort -nr | uniq -c 来对 jstack 的状态有一个整体的把握,如果 WAITING 之类的特别多,那么多半是有问题啦。
?
cat jstack_result.log | grep "java.lang.Thread.State" | sort -nr | uniq -c
执行下面命令下载arthas包,敲下回车键就可以下载对应jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
使用thread命令查看那个线程cpu最高
?thread 线程id 即可排查定位到异常代码来分析,简直不能太easy?