Java Mission Control (JMC) and Java Flight Recorder (JFR)
JMC 是个图形化工具, 监控JVM 以及操作系统的一些指标; 它可以直接连JVM 去采集, 也可以读存档的JFR文件;
JFR 对于java应用程序进行诊断和profiling的工具, 它集成在HotSpot JVM 里面, 并且有很小的性能影响. 基于一组事件去采集,记录;可以通过JMC图形化界面控制JFR 事件,也可以通过jcmd 命令行来执行;
- 默认开启的JFR事件有小于1%的性能影响;
- 事件类型: 内存, 线程, I/O, code (编译, hot package, hot class),系统;
-- 基于事件长度的event, 记录事件长度, 你可以设置超过每个长度的才记录;
-- 瞬时事件
-- 采样(sampling) 事件, 你可以配置采样频率;
- 每个事件有 事件名称, 时间戳, 和payload 组成;
- 通过各种纬度的事件, 你可以构建运行时系统状态;
- 数据流: JFR collects data from the JVM (through internal APIs) and from the Java application (through the JFR APIs). This data is stored in small thread-local buffers that are flushed to a global in-memory buffer. Data in the global in-memory buffer is then written to disk.
- JFR 架构
-- JFR 运行时引擎, 它产生事件到buffer,并可选持久化到磁盘
-- JFR plugin 在JMC里面分析JFR事件
- JFR 默认是disabled, 并且在HotSpot JVM里面是商业软件, 所以要在启动时通过2个flags 来启动它
-- java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder MyApp
-- java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true MyApp
-- for OpenJDK, 要使用JDK 11, 这篇文章介绍如何在 openJDK 使用 JFR https://dzone.com/articles/using-java-flight-recorder-with-openjdk-11-1
启动app时, 可以通过 -XX:+FlightRecorderOptions=string 来设置参数, 多个参数用逗号隔开, 可选参数如下
name=name
The name used to identify the recording.
defaultrecording=<true|false>
Whether to start the recording initially. The default value is false; for reactive analysis, this should be set to true.
settings=path
Name of the file containing the JFR settings (see next section).
delay=time
The amount of time (e.g., 30s, 1h) before the recording should start.
duration=time
The amount of time to make the recording.
filename=path
Name of the file to write the recording to.
compress=<true|false>
Whether to compress (with gzip) the recording; the default is false.
maxage=time
Maximum time to keep recorded data in the circular buffer.
maxsize=size
Maximum size (e.g., 1024K, 1M) of the recording’s circular buffer.- 上面参数可以在启动时传入, 但是更灵活的方式是, 通过jcmd 运行时传入, 如:
jcmd process_id JFR.start [options_list] //start 时候可以选择模版 settings=
jcmd process_id JFR.dump [options_list] //dump 一个连续的recording
jcmd process_id JFR.check [verbose] //check 当前的recording
jcmd process_id JFR.stop [options_list]
- 选取JFR 事件
JFR 事件是基于模版的, HotSpot 默认有2个模版: default template & a profile template;
这些event template 都是xml 文件, 2个默认的模版在$JAVA_HOME/ jre/lib/jfr 目录, 用户自定义的在 $USER_HOME/.jmc/