JMC 使用

Java Mission Control(JMC)是 JFR 数据的图形化分析工具,提供直观的性能问题诊断能力。

JMC 界面

JMC 的主要界面:

flowchart TB
    subgraph JMC 界面
        A["JVM Browser\nJVM 连接管理"]
        B["Flight Recorder\n飞行记录"]
        C["JVM Browser\n概览"]
        D["Memory\n内存分析"]
        E["Code\n代码分析"]
        F["Threads\n线程分析"]
        G["I/O\nI/O 分析"]
    end

启动 JMC

# JDK 8 及之前
jmc

# JDK 11+ 需要单独安装
# https://github.com/JDKMissionControl/jmc

连接 JVM

方式一:实时连接

# 确保 JVM 启用 JMX
java -Dcom.sun.management.jmxremote.port=9010 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     -jar app.jar

# JMC -> File -> Connect -> Create New Connection
# 输入主机和端口

方式二:打开录制文件

# JMC -> File -> Open File
# 选择 .jfr 文件

概览视图

概览视图显示系统运行状态的总体摘要:

flowchart LR
    subgraph 概览内容
        A["执行时间线"]
        B["内存使用"]
        C["GC 事件"]
        D["CPU 负载"]
        E["异常抛出"]
    end

关键指标:

  • 飞行时间:录制时长
  • 事件数量:采集的事件总数
  • 内存趋势:堆内存使用曲线
  • GC 暂停:GC 停顿时间线

内存视图

堆内存分析

// 关键内存指标
GC Count: 45
GC Pause Time: 1.2s
Total Heap Allocated: 50GB
Average Allocation Rate: 200MB/s

分配分析

类型数量大小占比
byte[]1,234,56750GB45%
String5,678,90120GB18%
Object[]987,65415GB14%

TLAB 分析

TLAB(Thread Local Allocation Buffer)分析显示各线程的分配情况。

代码视图

CPU 负载分析

flowchart LR
    subgraph CPU 热点
        A["Hot Methods\n热点方法排名"]
        B["Call Tree\n调用树"]
        C["Flame Graph\n火焰图"]
    end

热点方法

方法调用次数自时间总时间占比
Service.process()1,000,0005.2s10.5s50%
DAO.query()2,000,0002.1s8.3s40%
Util.format()500,0000.3s0.5s2%

线程视图

线程状态

flowchart LR
    subgraph 线程状态
        A["Running\n运行中"]
        B["Blocked\n阻塞"]
        C["Waiting\n等待"]
        D["Timed Waiting\n计时等待"]
    end

锁竞争分析

锁对象持有时间等待次数平均等待时间
com.example.Lock500ms1005ms
java.util.concurrent200ms504ms

自动分析报告

JMC 内置了自动分析引擎,会识别常见的性能问题:

常见问题类型

问题严重性说明
GC 暂停过长GC 暂停超过 1 秒
高分配率分配速率异常
同步热点synchronized 竞争激烈
异常过多异常抛出频繁

问题详情

点击问题项,可以查看详细说明和建议:

Problem: Long GC pause
Severity: High
Description: The garbage collector is pausing application threads for
             more than 1 second.

Recommendation:
1. Increase heap size if memory is available
2. Switch to G1 or ZGC
3. Reduce object allocation rate

JFR 模板配置

创建自定义模板

# 导出默认模板
jfr configure --output template.jfc

# 编辑模板
# JMC -> Flight Recorder -> Templates -> Edit

# 使用自定义模板
java -XX:FlightRecorderOptions=settings=template.jfc -jar app.jar

模板配置项

template.jfc
<?xml version="1.0" encoding="UTF-8"?>
<configuration version="2.0">
    <event path="gc">
        <setting name="enabled">true</setting>
        <setting name="threshold">1 ms</setting>
    </event>

    <event path="cpu">
        <setting name="enabled">true</setting>
        <setting name="period">everyChunk</setting>
    </event>
</configuration>

常用分析流程

流程一:GC 问题排查

flowchart TD
    A["打开 JMC"] --> B["概览视图"]
    B --> C{"GC 暂停是否异常?"}
    C -->|是| D["查看 GC 详情"]
    C -->|否| E["查看其他指标"]
    D --> F["分析 GC 类型"]
    F --> G["调整 GC 参数"]

流程二:CPU 问题排查

flowchart TD
    A["代码视图"] --> B["热点方法"]
    B --> C["查看调用树"]
    C --> D["定位耗时操作"]
    D --> E["优化代码"]

流程三:内存泄漏排查

flowchart TD
    A["内存视图"] --> B["分配分析"]
    B --> C{"分配是否正常?"}
    C -->|否| D["查看 OldObjectSample"]
    C -->|是| E["继续分析"]
    D --> F["定位泄漏点"]
    F --> G["修复代码"]

本章小结

JMC 的核心功能:

  • 概览视图:系统运行状态总览
  • 内存视图:GC 和分配分析
  • 代码视图:CPU 热点分析
  • 线程视图:线程状态和锁竞争
  • 自动分析:识别常见性能问题

延伸思考

JMC 与其他 Profiler 的区别?

  • JMC:基于 JFR,低开销,生产环境友好,数据全面
  • async-profiler:更轻量,适合火焰图
  • JProfiler:商业工具,功能全面但有开销

建议先用 JMC 进行全面分析,再用其他工具深入特定问题。