更新 JFR参数详解.md

This commit is contained in:
8ga 2025-03-11 11:16:07 +08:00
parent 3e7bb69af9
commit e24bde82eb

View File

@ -8,12 +8,45 @@ JFR是**Java Flight Record**Java飞行记录的缩写是JVM内置的基
为了在生产环境更好的定位问题。JDK提供了一个可以长期开启对应用影响很小的持续监控手段官方的目标是开启JFR监控默认配置非profile**对性能的影响在1%以内对JVM Runtime、GC、OS以及Java库进行全方位的监控。** 为了在生产环境更好的定位问题。JDK提供了一个可以长期开启对应用影响很小的持续监控手段官方的目标是开启JFR监控默认配置非profile**对性能的影响在1%以内对JVM Runtime、GC、OS以及Java库进行全方位的监控。**
### JFR的核心Event ### JFR的核心Event
在JFR中一切皆为Event任意JVM行为都是一个Event 在JFR中一切皆为Event任意JVM行为都是一个Event,例如:
- 类加载Class Load Event - 类加载Class Load Event
- 开启JFR记录Recording Reason Event - 开启JFR记录Recording Reason Event
- 就算是有Event丢失他也是一个 EventData Loss Event - 就算是 Event 丢失,也是一个 Data Loss Event
Event 在某些特定的时间点产生由名称、时间戳、Event 数据体组成。不同的 Event 数据体不同(例如 CPU 负载Event 前后的 Java 堆大小,获取锁的线程 ID 等) Event 在某些特定的时间点产生,**由名称、时间戳、Event 数据体组成。**不同的 Event 数据体不同(例如 CPU 负载Event 前后的 Java 堆大小,获取锁的线程 ID 等)
> 大部分的 Event都有 Event 是在哪个线程发生的、线程的调用栈、Event 持续时间,利用这些信息,我们可以回溯 Event 发生当时的情况。
### Event类型
Event 按照采集方式可以分为三种:
- Instant Event这种 Event 在发生时就立刻采集。例如Throw Exception Event、Thread Start Event这种在某一时刻发生的 Event
- Duration Event这种 Event 在完成的时候记录。因为需要耗费一些时间但可以设置一个时间限制超时才记录。例如GC Event、Thread Sleep Event
- Sample EventRequestable Event这种 Event 按照一定的频率采集。频率是可以配置的例如Thread Dump Event、Method Sampling Event
由于 JFR 会采集很多很多的数据,为了效率,最好配置自己感兴趣的事件采集。并且对于 Duration Event 设置时间限制,一般我们对于时间短的事件并不关心。
### Event存储
Event 会被写入`.jfr`的二进制文件中,以`little endian base 128`的形式编码,以 Class Load Event 举个例子:
```
0000FC10 : 98 80 80 00 87 02 95 ae e4 b2 92 03 a2 f7 ae 9a 94 02 02 01 8d 11 00 00
```
- 0000FC10: 文件位置
- 98 80 80 00: Event大小
- 87 02: Event ID
- 95 ae e4 b2 92 03: 时间戳
- a2 f7 ae 9a 94 02: 持续时间
- 02: 线程 ID
- 01: 堆栈 ID
- 8d 11: 加载的类
- 00 : 定义类的 ClassLoader
- 00 : 初始化类的 ClassLoader
> 实际使用中,通过可视化工具**JMC**查看`.jfr`文件
### JFR如何实现的低延迟与低性能损耗
> 大部分的 Event都有 Event 是在哪个线程发生的、线程的调用栈、Event 持续时间,利用这些信息,我们可以回溯 Event 发生当时的情况。