利用jfr文件分析java工程分享

引言:一般可以通过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是和开始时分配的编号来定的

利用jfr文件分析java工程分享_第1张图片

7、拉下文件后,打开java安装目录,有个jmc.exe打开,将*.jfr拖入,等待加载

利用jfr文件分析java工程分享_第2张图片

8、开始分析。参数有很多,我自己也没有完全摸透,只分享我用到的一些参数查看。可自行学习其他具体参数。

一般信息:

    分别记录了,堆使用量、cpu和GC信息。可以大致了解下总体运行概况

利用jfr文件分析java工程分享_第3张图片

内存

    可以看到具体GC回收情况和总体GC每个区域回收时间和总体GC暂停概况,对于性能的调优是个很好的入口


利用jfr文件分析java工程分享_第4张图片
利用jfr文件分析java工程分享_第5张图片

代码

    代码,主要是可以查看每个包执行耗时比例,甚至统计调用最多的方法等信息。可以用来优化代码的使用。


利用jfr文件分析java工程分享_第6张图片
利用jfr文件分析java工程分享_第7张图片

线程

    线程是最值得参考的点之一,很多时候耗时操作都可以从这里得到答案。能查看争用最多的线程在哪个方法、哪个类执行,也可以看到等待时长最多线程是耗费在哪一步操作。包括热点线程号,可以对应日志进行查询


利用jfr文件分析java工程分享_第8张图片
利用jfr文件分析java工程分享_第9张图片

IO

    这部分通常也是最关注的点之一,对文件IO和套接字IO都有详细统计。文件写入也会记录工程日志输出的IO操作。

利用jfr文件分析java工程分享_第10张图片

二、使用案例

三、总结

注意,使用前记得留出充足的空间写出jfr文件,否则会加载失败,功亏一篑。

最后,一切工具,都是为了更好更快解决问题所在,没有最优工具,只有最适合的工具。所以希望能继续积累排查、优化的实战经验,形成故障定位和解决的思路和策略,再结合工具快速解决问题。

你可能感兴趣的:(利用jfr文件分析java工程分享)