和传统的JProfiler/VisualVM这些基于JMX的工具所不同的是,JFR记录的信息是近似而非精确的;当然大部分情况下这些模糊性信息就足够说明问题了。 对于大部分场景下,这些近似信息反而可以更容易发现一些真正的问题。
1 | env.java.opts: "-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints" |
加入java opts
开启jfr
1 | /usr/local/jdk1.8.0_112/bin/jcmd 47897 JFR.start name=MyRecording settings=/home/zhouhai02/flink_profiler.jfc delay=5s duration=10m |
check
1 | /usr/local/jdk1.8.0_112/bin/jcmd 47897 JFR.check |
导出
1 | /usr/local/jdk1.8.0_112/bin/jcmd 47897 JFR.dump name=MyRecording filename=dump.jfr |
导入到JMC上去分析
Java Mission Control
热点线程
给出线程上下文切换的频率。同样,也可以类似得出相应的切换时间
同时,火焰图部分
火焰图展示了在采样周期内,code-path被执行的时间占比,纵轴是code-path,从下至上一般就是调用栈,相同的采样调用栈会被合并,栈顶元素就是采样的时候CPU运行的stack,横轴是某个stack的占用时间,跨度越大说明其占CPU比重越高,也就是最耗费CPU的,stack在横轴上是按照字母序排列的,颜色深浅仅仅是为了区分,并没特殊意义。我只需要关注火焰图中的“平顶山”,这往往代表着某段代码的调用占用CPU过多。