从这个公式可以看出,权重系数 t 以指数等比形式缩小,时间越靠近当前时刻的数据加权影响力越大。
这个 t 越小,过去过去累计值的权重越低,当前抽样值的权重越高,平均值的实时性就越强。反之 t 越大,吸收瞬时突发值的能力变强,平均值的平稳性更好。
对于 jdk.ObjectAllocationSample 这个事件,算法实现即 jfrEventThrottler.hpp。如果大家感兴趣,可以在运行实例程序的时候,增加如下的启动参数 -Xlog:jfr+system+throttle=debug 来查看这个 EWMA 采集窗口的相关信息,从而理解学习源码。日志示例:
[0.743s][debug][jfr,system,throttle] jdk.ObjectAllocationSample: avg.sample size: 0.0000, window set point: 0, sample size: 0, population size: 0, ratio: 0.0000, window duration: 0 ms [1.761s][debug][jfr,system,throttle] jdk.ObjectAllocationSample: avg.sample size: 0.0400, window set point: 1, sample size: 1, population size: 19, ratio: 0.0526, window duration: 1000 ms [2.775s][debug][jfr,system,throttle] jdk.ObjectAllocationSample: avg.sample size: 0.0784, window set point: 1, sample size: 1, population size: 19, ratio: 0.0526, window duration: 1000 ms [3.794s][debug][jfr,system,throttle] jdk.ObjectAllocationSample: avg.sample size: 0.1153, window set point: 1, sample size: 1, population size: 118, ratio: 0.0085, window duration: 1000 ms [4.815s][debug][jfr,system,throttle] jdk.ObjectAllocationSample: avg.sample size: 0.1507, window set point: 1, sample size: 1, population size: 107, ratio: 0.0093, window duration: 1000 ms 总结jdk.ObjectAllocationSample 是 Java 16 引入,用来优化对象分配不容易高效监控的事件。
jdk.ObjectAllocationSample 事件里面的 ObjectClass 是触发事件的 class,weight 是线程分配的对象总大小。所以实际观察的时候,采集会与实际情况有些偏差。这是高效采集无法避免的。
JVM 通过 EMWA 做了算法优化,采集到的事件随着程序运行会越来越是你的性能瓶颈或者热点代码相关的事件。
微信搜索“我的编程喵”关注公众号,加作者微信,每日一刷,轻松提升技术,斩获各种offer: