JFR
Java JFR的全称是Java Flight Recorder。这是Java开发工具包(JDK)中的一个功能强大的性能分析和故障排查工具。
它需要配合JMC(JDK Mission Control)工具来分析收集的记录数据。
如何开启记录器
- 查看java程序进程号
- 使用jdk命令jcmd解锁商业功能。在JVM启动时,如果使用-XX:+UnlockCommercialFeatures参数(默认false),则可以在程序退出时打印原生内存分配信息。这种打印信息的方式主要是为了调试和优化目的。
# jcmd [进程号] VM.unlock_commercial_features;
jcmd 42 VM.unlock_commercial_features;
- 使用jdk命令jcmd记录飞行数据
# jcmd [进程号] JFR.start name=[本次记录名称] duration=[记录秒数]s filename=[将记录数据保存到文件名].jfr;
# 记录时间不宜过长,jfr文件过大会导致jmc工具无法打开并分析
jcmd 42 JFR.start name=p-01 duration=420s filename=logs/p-01.jfr;
如何分析记录数据
-
下载上一步记录的p-01.jfr文件
-
使用jmc工具打开
-
首先查看“自动分析结果”,了解jvm概要信息,重点关注50分以上的项目
-
根据分析提示逐条分析,一般我们比较关注的指标是:
-
线程,分析线程数量是否合理。
-
内存,分析是否存在内存泄露等。
-
锁定对象,分析代码瓶颈(哪些代码执行时间过长)。
-
垃圾收集,GC是否正常、耗时是否过长等。
-
结论
- 根据分析结果做相应处理
- 如:内存存在泄露,则分析“活动对象”常驻内存的是哪些引用
- 如:“锁定对象”时间过长,则分析是哪些代码在锁定这些对象,进一步分析对应代码如何优化
- 如:GC不正常,则分析jvm参数是否应该调整,垃圾回收期是否修改为更高效的收集器等