一文学会java死锁和cpu( 二 )


执行jps-l可以打印出所有应用的pid,发现有一个pid和这个cpu用的id是一样的!我们就知道是哪种服务了 。知道了相应的服务,接下来的分析步骤 。
三,使用pidstat-ppid1 3 -u-t
-p:指定流程编号
-u:默认参数,显示每个进程的cpu使用统计
-t:显示除了选择任务的线程的统计信息之外的附加信息
四,找到了cpu占用率高的线程tid 。通过上图,发现3467的tid占用了很大的cpu
五,因为jstack命令的输出文件中记录的线程id是十六进制的 。因此,我们首先将tid转换为十六进制表示,转换模式参见下图 。
把3467转换成十六进制d8d,注意是小写!记下来,以后用 。
六,通过jstack[-l] pid输出当前进程的线程信息
仪表流程图/温度/测试日志
七,找到tid对应的线程(输出线程id是十六进制),找到对应的代码,用命令找到,不要用肉眼对比,请思考具体的命令,给你一个展示的机会 。
找到之后,分析一下这个线程在做什么,为什么会占用那么多cup资源 。
ps:线程的几种状态描述如下:
新的,没有开始 。不会出现在转储中 。
runnable,在虚拟机中执行 。
blocked,blocked,等待显示器锁定 。
观察,无限期等待另一个线程执行特定的操作 。
timed_wating,在有限的时间内等待另一个线程的特定操作 。
终止,退出 。
第二个姿势,待开发[奸笑脸]
这里省略了很多文字 。
03 推荐两个高效排查问题工具
一:显示繁忙的java线程
地址:show-busy-java-threads:https://github.com/oldtlee/有用-scripts/blob/master/docs/java. md#-show-busy-java-threads
简单的安装和使用过程:
show-busy-java-线程
上传服务器并解压缩
然后执行相应的命令
二:阿里的开源问题定位神器阿尔萨斯被用来定位问题 。
网站地址:阿尔萨斯:https://alibaba.github.io/arthas/index.html
这个里面有很多命令 。比如线程支持显示比较忙的前n个线程,一键打印栈 。比较简单的线程-n10可以打印比较忙的十个线程的快照,真的很高效 。
介绍了定位神器阿尔萨斯的安装过程 。如果你还没用过这个工具,建议你用一下 。也许你会喜欢!
04 总结
这篇文章内容比较多,基本上是手持教程 。希望能对你有所帮助 。我也建议没有遇到过类似问题的伙伴,看完之后亲自实践操作流程 。如果没有环境,他们可以尝试自己的方式做一个测试的例子 。还是那句老话:不要眼高手低,看了和做了本质上两个概念,比较终收获的也一定不同 。
05 彩蛋-另一个姿势
通过使用jstack,您还可以发现系统的代码性能问题
1.在压力测试期间,使用jps查找应用程序的pid
2.然后使用jstack输出压力测试期间应用的转储信息
3.在分析输出的日志文件中,block线程占用的空间比较大,这里可能存在性能问题 。找到相应的代码分析