引言:一般可以通过jstack来分析线程栈来获取一些线程信息,得到问题的解决入口。其使用简单,jstack pid即可查看线程信息,具体也有故障排查的使用案例。但是jstack相当于某一时刻的快照,如果我想全量分析某一时间段的内容,并且想要人性化的界面,那么就可以借助jcmd命令来生成JFR飞行记录仪,用java自带的jmc做分析和优化。
一、使用
1、找到java进程pid。(ps -ef | grep 工程)
2、使用前解锁(jcmd [pid] VM.unlock_commercial_features )
3、开始jfr手动记录(有固定时长的记录方式,可自行百度,但是不太灵活故用手动方式)
jcmd [pid] JFR.start name=endless settings=profile delay=3s duration=0 compress=true
基本上后面参数不用动,不影响分析,delay是延迟多少秒执行,自己注意。还有返回结果中的recording编号要自己记住。
4、查看是否正在运行(jcmd [pid] JFR.check )
5、如果觉得要分析的时间段够了,就手动转存dump文件(后缀为jfr格式)
jcmd [pid] JFR.dump recording=8 filename="./shcrmserver.jfr" compress=true
注意:a、filename的相对路径是相对执行命令的目录而言的,可以从返回结果看出本次是在tomcat的bin目录下。b、recording编号要写正确。
6、结束记录(jcmd [pid] JFR.stop recording=8 )。注意:8是和开始时分配的编号来定的
7、拉下文件后,打开java安装目录,有个jmc.exe打开,将*.jfr拖入,等待加载
8、开始分析。参数有很多,我自己也没有完全摸透,只分享我用到的一些参数查看。可自行学习其他具体参数。
一般信息:
分别记录了,堆使用量、cpu和GC信息。可以大致了解下总体运行概况
内存
可以看到具体GC回收情况和总体GC每个区域回收时间和总体GC暂停概况,对于性能的调优是个很好的入口
代码
代码,主要是可以查看每个包执行耗时比例,甚至统计调用最多的方法等信息。可以用来优化代码的使用。
线程
线程是最值得参考的点之一,很多时候耗时操作都可以从这里得到答案。能查看争用最多的线程在哪个方法、哪个类执行,也可以看到等待时长最多线程是耗费在哪一步操作。包括热点线程号,可以对应日志进行查询
IO
这部分通常也是最关注的点之一,对文件IO和套接字IO都有详细统计。文件写入也会记录工程日志输出的IO操作。
二、使用案例
略
三、总结
注意,使用前记得留出充足的空间写出jfr文件,否则会加载失败,功亏一篑。
最后,一切工具,都是为了更好更快解决问题所在,没有最优工具,只有最适合的工具。所以希望能继续积累排查、优化的实战经验,形成故障定位和解决的思路和策略,再结合工具快速解决问题。