我正在添加自定义飞行记录器事件来跟踪我们的一些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
(转义分析可能会随着时间的推移而改进,也许将来可以使用原始对象。在线程本地缓存可能是一种反模式,特别是在虚拟线程即将到来的情况下)