Java Flight Recorder
Profiling是最常见的,用来定位代码性能问题的方法。
在开发环境中,我们用Visualvm、JProfiler、Yourkit等。这些工具功能强大,支持图形化界面操作,可以让我们很快定位代码问题。
但是他们对应用性能的影响也非常大,所以不适合在生产环境下使用。还有这些软件要attach到jvm进程上,生产环境一般网络隔离,很难做到。
在生产环境我们最常用的profiling工具就是java/bin下的jstack,多做几次jstack,也相当于profiling了。有很多工具就是对多次的jstack结果进行合并,来分析问题的。
jstack方便易用,但并不是特别适合来做profiling,操作频率低,会导致safepoint指标急剧增长等等。
于是我们尝试使用Jvm原生提供的JFR - Java Flight Recorder 来解决问题。
使用方法
-
jcmd pid VM.unlock_commercial_features
-
jcmd pid JFR.start duration=60s filename=/home/peiliping/dev/logs/test.jfr settings=[default,profile]
-
jcmd pid JFR.check 检查当前运行状况
-
jcmd pid JFR.stop name=test.jfr 或者 jcmd pid JFR.stop recording=3 name和recording的值参见check的结果
-
将生成的jfr文件传回到自己的电脑中
-
shell下执行jmc,启动图形化客户端,导入jfr文件,就可以看到cpu、gc、线程、io、代码热点等监控信息了
-
如果需要定制化jfr抓取的指标,可以修改setting的xml文件,/…./JDK/jdk1.8.0_51/jre/lib/jfr/