Java Flight Recorder和Java Mission Control的使用
使用jfr记录jvm信息有两种方式,一种是在jvm启动时加在虚拟机参数中,另一种是在jvm启动后使用jcmd命令实时附着在jvm。
jfr是商用的、需要许可证,我们在测试环境中可以在虚拟机参数中加入-XX:+UnlockCommercialFeatures
解锁商业用途,也可以在jvm启动后使用命令开启 jcmd $pid VM.unlock_commercial_features
。
- 在jvm 参数中配置jfr
# memorysize FR在内存中缓存事件数据的环形缓冲区大小;
#repository jfr文件的磁盘目录路径,当disk=true时JFR会将数据写入此目录
# maxage 设置仓库中文件的最大保存时间,超过此时间的旧录制文件会被自动删除
#delay 应用启动后延迟开始录制的时间,默认是零
# duration 设置单次录制的持续时间,0 表示无限期录制(需要手动停止)
# filename 指定录制文件的输出路径和文件名 (文件名模版变量 %t:时间戳 %p:进程ID %n:序列号)
java -XX:+UnlockCommercialFeatures \-XX:FlightRecorderOptions=memorysize=50m,disk=true,repository=/var/log/jfr,maxage=72h \-XX:StartFlightRecording=delay=2m,duration=24h,name=ProdRecording,filename=/var/log/jfr/prod-%t.jfr \-jar app.jar
- jcmd记录jfr
# jcmd [进程号] JFR.start name=[本次记录名称] duration=[记录秒数]s filename=[将记录数据保存到文件名].jfr;
jcmd $pid JFR.start name=xxx duration=49s filename=logs/xxx.jfr;
注意:启动jvm的jdk版本及厂商要和 jfr/jmc的一致,否则可能无法采集jfr或无法正常分析jfr文件。当时本人启动java应用的jdk是zulu厂商的,但jfr/jmc的JDK是oracle官方的,这就直接导致jfr文件数据无法被jmc识别。