更新 初识JFR.md

This commit is contained in:
8ga 2025-03-11 14:29:50 +08:00
parent d2f441bb6e
commit d2077861cd

View File

@ -74,4 +74,33 @@ Event 是多线程产生的,如果 Event 记录要保证全局有序,那么
⚠️数据在从 Thread Buffer 刷入 Global Bufeer 的时候, 去 dump JFR 的数据,可能这部分数据会被忽略而导致看不到。 ⚠️数据在从 Thread Buffer 刷入 Global Bufeer 的时候, 去 dump JFR 的数据,可能这部分数据会被忽略而导致看不到。
⚠️从 Global Buffer 刷入磁盘不够快的时候,这时候要刷入磁盘的数据可能被丢弃。此时会记录下 Data Loss Event 包含了哪块时间的数据丢了,通过 JFR 日志也能看到这个信息。 ⚠️从 Global Buffer 刷入磁盘不够快的时候,这时候要刷入磁盘的数据可能被丢弃。此时会记录下 Data Loss Event 包含了哪块时间的数据丢了,通过 JFR 日志也能看到这个信息。
### 开启JFR
有2种方式开启通过启动参数在启动的时候开启、jcmd在运行时启用/关闭。
#### 启动参数
在JDK11以后启动参数简化了。
- 启动JFR记录的参数`-XX:StartFlightRecording`
- 用于配置JFR的参数`-XX:FlightRecorderOptions`
*JDK8中的`-XX:+FlightRecorder`状态位不再需要了*
#### StartFlightRecording
|配置项|默认值|说明|
|:-----|:------|:-----|
|delay|0|延迟多久后启动 JFR 记录支持带单位例如delay=60s、delay=20m、delay=1h、 delay=1d|
|disk |true|是否写入磁盘,控制 global buffer 满了之后,是丢弃还是写入磁盘|
|dumponexit |false |程序退出时是否要dump出 .jfr文件|
|duration | 0 | JFR 记录持续时间支持单位配置0代表一直记录|
|filename |- | dump的输出文件例如启动目录/hotspot-pid-26732-id-1-2020_03_12_10_07_22.jfrpid是进程idid后面的1代表第1个jfr文件|
|name | - | 由于可以启动多个 JFR 记录,这个名称用于区分,否则只能看到一个记录 id不好区分|
|maxage | 0 | disk=true生效global buffer 刷入的文件保留时间支持单位配置0代表一直保存|
|maxsize | - | disk=true生效global buffer 刷入的文件最大值支持单位配置MB、GB例如250MB这个配置不能小于**maxchunksize**参数|
|path-to-gc-roots| false | 是否记录GC根节点到活动对象的路径一般不打开这个性能损耗比较大会导致FullGC。一般是在怀疑有内存泄漏、通过对象堆栈无法定位的时候动态打开。例如 ThreadLocal 没有释放这样的,可以在 dump 的时候采集 gc roots|
|settings | default.jfc| 采集 Event 的详细配置可选值default.jfc、profile.jfc|
#### FlightRecorderOptions