Java Mission Control (JMC) and Java Flight Recorder (JFR)

JMC 是个图形化工具, 监控JVM 以及操作系统的一些指标; 它可以直接连JVM 去采集, 也可以读存档的JFR文件;
JFR 对于java应用程序进行诊断和profiling的工具, 它集成在HotSpot JVM 里面, 并且有很小的性能影响. 基于一组事件去采集,记录;可以通过JMC图形化界面控制JFR 事件,也可以通过jcmd 命令行来执行;

  1. 默认开启的JFR事件有小于1%的性能影响;

  2. 事件类型: 内存, 线程, I/O, code (编译, hot package, hot class),系统;
    -- 基于事件长度的event, 记录事件长度, 你可以设置超过每个长度的才记录;
    -- 瞬时事件
    -- 采样(sampling) 事件, 你可以配置采样频率;

  3. 每个事件有 事件名称, 时间戳, 和payload 组成;

  4. 通过各种纬度的事件, 你可以构建运行时系统状态;

  5. 数据流: 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.

  6. JFR 架构
    -- JFR 运行时引擎, 它产生事件到buffer,并可选持久化到磁盘
    -- JFR plugin 在JMC里面分析JFR事件

  7. 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

  8. 启动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.

  9. 上面参数可以在启动时传入, 但是更灵活的方式是, 通过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]

  10. 选取JFR 事件
    JFR 事件是基于模版的, HotSpot 默认有2个模版: default template & a profile template;
    这些event template 都是xml 文件, 2个默认的模版在$JAVA_HOME/ jre/lib/jfr 目录, 用户自定义的在 $USER_HOME/.jmc/ 目录;

标签: none

添加新评论