如何创建一个可重用的即时(非持续时间)Java FlightRecorder JFR事件?



我正在添加自定义飞行记录器事件来跟踪我们的一些KPI,并使它们通过飞行记录转储暴露。

我遇到的一个问题是如何将事件标记为"即时"事件;或";duration"基于事件。

https://docs.oracle.com/javacomponents/jmc-5-4/jfr-runtime-guide/about.htm JFRUH171

从我有限的测试中,似乎调用commit的事件,你以后重用(说在ThreadLocal)使第二个&接下来对commit的调用包括结束时间戳和第二次提交和第一次提交之间的持续时间。这并不适合我当前的用例,因为我对事件创建和提交调用之间的时间不感兴趣。

在我看来,如果您总是实例化新事件并省略调用begin,则执行构造一个没有持续时间的事件——但出于性能原因,我宁愿避免每次生成新事件所带来的开销,并限制堆分配。

所有事件都是持续的,因为它们包含一个名为duration的字段。如果没有呼叫begin()end(),只呼叫commit(),时长设置为0。它将在文件中为每个事件添加一个字节,开销可以忽略不计。当涉及到缓存和重用事件实例时,它不受支持,但在某些情况下它可以工作。

推荐的方法是为每个事件创建一个对象。在大多数情况下,如果对象没有逃逸,JIT能够消除分配。也就是说,将使用事件对象的方法留在。

中。这个视频描述了禁用事件的过程,但是一些优化也适用于启用事件。https://youtu.be/plYESjZ12hM?t=1126

(转义分析可能会随着时间的推移而改进,也许将来可以使用原始对象。在线程本地缓存可能是一种反模式,特别是在虚拟线程即将到来的情况下)

最新更新