使用YCSB测试Apache Ignite时自定义JFR缓存事件未生成记录排查
核心排查方向及修复建议
自定义事件未被JVM正确识别
你的JFR事件类需要遵循JFR规范:用@jdk.jfr.Name、@jdk.jfr.Label等注解正确标记,类必须是public权限,同时要确保事件类处于Ignite核心模块的类加载路径下,能被Ignite的类加载器正常加载。另外JFR事件类需要在JVM启动前完成注册,所以必须保证事件类被编译进Ignite的核心JAR包中。缓存操作未经过你修改的代理类
IgniteCacheProxyImpl是对外的代理层,但Ignite内部实际执行缓存逻辑的是更底层的实现类——比如GridCacheAdapter中的get0、put0、remove0方法。你在代理层添加的事件调用可能没被触发,建议在这些核心执行方法中添加事件的启动和结束逻辑。JFR启动参数未指定捕获自定义事件
默认情况下JFR不会自动采集所有自定义事件,必须在启动参数里明确指定要捕获的事件。比如启动Ignite时要加上:-XX:StartFlightRecording=filename=ignite_cache.jfr,settings=profile,events=org.apache.ignite.internal.processors.cache.CacheGet,org.apache.ignite.internal.processors.cache.CachePut,org.apache.ignite.internal.processors.cache.CacheRemove这里的
events参数要精确匹配你自定义事件的全限定类名。构建时未打包自定义事件类
检查Maven构建后的ignite-core-2.16.0.jar,确认其中包含你的CacheGet.class、CachePut.class、CacheRemove.class。如果没有,可能是事件类存放目录错误,或者Ignite的Maven构建配置排除了新增类,需要调整构建脚本确保类被正确编译打包。事件触发逻辑存在漏洞
检查你在get()/put()/remove()方法中调用事件的代码,必须用try-finally保证事件生命周期被正确管理:CacheGetEvent event = new CacheGetEvent(); event.begin(); try { // 原有get方法逻辑 return super.get(key); } finally { event.end(); }避免因为异常导致事件未被提交。
额外验证步骤
- 确认启动的Ignite是你本地构建的版本,而非官方默认包,避免代码修改未生效。
- 用
jfr print直接查看JFR文件,跳过JSON转换步骤——部分转换工具会过滤自定义事件,比如执行:jfr print --events CacheGet ignite_cache.jfr
内容的提问来源于stack exchange,提问作者Sameer Bharatia

