You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JMC工具的JFR分析规则导入自定义RuleRegistry?

如何加载JMC内置JFR分析规则到自定义Java项目

问题背景

你想编写Java类分析JFR dump,输出类似JMC的告警(比如长套接字读取停顿、JVM全量停顿),但发现RuleRegistry.getRules()返回空列表——因为JMC的规则不会自动加载,需要手动引入依赖并注册。


步骤1:添加依赖

JMC的分析规则在独立模块中,需在项目中引入以下依赖(版本建议用JMC最新稳定版,比如8.2.0):

Maven 依赖

<dependencies>
    <dependency>
        <groupId>org.openjdk.jmc</groupId>
        <artifactId>jmc-flightrecorder-rules</artifactId>
        <version>8.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.openjdk.jmc</groupId>
        <artifactId>jmc-core</artifactId>
        <version>8.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.openjdk.jmc</groupId>
        <artifactId>jmc-flightrecorder</artifactId>
        <version>8.2.0</version>
    </dependency>
</dependencies>

Gradle 依赖

dependencies {
    implementation 'org.openjdk.jmc:jmc-flightrecorder-rules:8.2.0'
    implementation 'org.openjdk.jmc:jmc-core:8.2.0'
    implementation 'org.openjdk.jmc:jmc-flightrecorder:8.2.0'
}

步骤2:注册JMC内置规则

RuleRegistry默认不会自动扫描加载规则,需调用JMC内部初始化方法注册所有内置规则:

// 初始化所有JMC内置分析规则
org.openjdk.jmc.flightrecorder.rules.internal.RulesInitializer.initialize();

完整可运行代码示例

结合你提供的代码修改后,完整实现如下:

import org.openjdk.jmc.common.item.IItemCollection;
import org.openjdk.jmc.flightrecorder.JfrLoaderToolkit;
import org.openjdk.jmc.flightrecorder.rules.IRule;
import org.openjdk.jmc.flightrecorder.rules.Result;
import org.openjdk.jmc.flightrecorder.rules.RuleRegistry;
import org.openjdk.jmc.flightrecorder.rules.internal.RulesInitializer;
import org.openjdk.jmc.flightrecorder.rules.util.IPreferenceValueProvider;

import java.io.File;
import java.util.concurrent.RunnableFuture;

public class JfrAlertAnalyzer {
    public static void main(String[] args) throws Exception {
        // 初始化JMC内置的所有分析规则
        RulesInitializer.initialize();

        // 加载目标JFR dump文件
        IItemCollection events = JfrLoaderToolkit.loadEvents(new File("abcd.jfr"));

        // 遍历所有规则执行分析
        for (IRule rule : RuleRegistry.getRules()) {
            RunnableFuture<Result> future = rule.evaluate(events, IPreferenceValueProvider.DEFAULT_VALUES);
            future.run();
            Result result = future.get();

            // 仅输出有问题的告警(score>0表示检测到异常,分数越高问题越严重)
            if (result.getScore() > 0) {
                System.out.printf("[告警] %s%n问题详情:%s%n%n", 
                    result.getRule().getName(), 
                    result.getShortDescription());
            }
        }
    }
}

关键说明

  • RulesInitializer.initialize():该方法会自动注册JMC所有内置规则,包括你需要的长套接字读取停顿、JVM全量停顿等告警规则。
  • 结果评分(Score):Result.getScore()返回0表示无异常,正数表示检测到问题,数值越大问题优先级越高,可根据这个过滤输出。
  • 依赖版本要保持一致:确保jmc-flightrecorder-rules、jmc-core、jmc-flightrecorder的版本相同,避免兼容性问题。

内容的提问来源于stack exchange,提问作者user9517026

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:28