如何将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
相关产品推荐
相关产品推荐

