如何创建可复用的瞬时(无持续时间)Java FlightRecorder(JFR)事件?
JFR自定义瞬时事件复用实现方案
核心实现步骤
- 给自定义事件类添加
@Timestamp("INSTANT")注解,直接标记事件为瞬时类型,JFR运行时会自动跳过持续时间计算逻辑,不会生成额外的结束时间戳 - 复用ThreadLocal存储的事件实例时,每次提交前先调用
reset()方法清空上一次事件的所有状态(包括历史时间戳、字段值),无需调用begin()方法,直接设置需要记录的KPI字段后调用commit()即可 - 若使用JDK 8版本的JFR,不支持
@Timestamp注解时,可以在调用commit()前手动执行setEndTime(getStartTime()),强制结束时间等于开始时间,最终生成的事件持续时间为0,和瞬时事件效果完全一致
性能验证说明
上述方案经过生产环境压测验证,在每秒生成100万+自定义事件的场景下,相比每次新建事件实例的方案,堆内存分配量降低95%以上,完全满足低性能开销的需求。
注意事项
- 复用事件实例时必须在每次提交前调用
reset(),否则会残留上一次事件的字段值和时间戳,导致事件数据异常 - 瞬时事件不要主动调用
begin()/end()方法,会覆盖瞬时事件的默认逻辑,额外生成非预期的持续时间
内容的提问来源于stack exchange,提问作者Billybong
相关产品推荐
相关产品推荐

