更新 初识JFR.md

This commit is contained in:
8ga 2025-03-11 16:04:48 +08:00
parent 276a6f20f3
commit 6e05a47610

View File

@ -1,6 +1,8 @@
### 出处
### 写在前面
[文章出处](https://zhuanlan.zhihu.com/c_1264859821121355776) [关注大佬](https://www.zhihu.com/people/zhxhash) 我只是对大佬的文章内容做一个笔记,加深记忆和理解。
我只是对大佬的文章内容做一个笔记,加深记忆和理解。
[文章出处](https://zhuanlan.zhihu.com/p/122247741) [关注大佬](https://www.zhihu.com/people/zhxhash)
### 什么是JFR
JFR是**Java Flight Record**Java飞行记录的缩写是JVM内置的基于事件的监控记录框架。这个起名参考了黑匣子对于飞机的作用将Java进程比喻成飞机飞行。顾名思义JFR主要用于问题定位和持续监控。
@ -120,3 +122,38 @@ Event 是多线程产生的,如果 Event 记录要保证全局有序,那么
|threadbuffersize | 8KB | Thread Buffer 大小,增加会带来更多内存开销,减小会增加刷入 global buffer 的次数8KB 是一个经验值|
### 配置项的联系和区别
#### disk=true
当 global buffer 满了,写入 repository 配置的目录,这个临时目录是**对用户不可见的**,临时目录地址是-Djava.io.tmpdir指定的默认为
- linux /tmp
- windows: C:\Users\用户名\AppData\Temp
目录结构的命名格式时间_pid例如
```
--/2020_03_12_08_04_45_10916
|----2020_03_12_08_04_45.jfr
|----2020_03_12_08_05_12.jfr
|----2020_03_12_08_05_55.jfr
|----2020_03_12_08_06_08.jfr
|----2020_03_12_08_06_08.part
```
每个.jfr就是一个 Data trunk最新的文件就是`.part`每个jfr文件的大小=Data trunk的大小。
#### dumponexit=true
程序退出的时候强制dump一次将数据输出到 filename 配置的文件。用户手动dump也会存储到这个文件**输出到这个文件目录的.jfr文件才对用户可见。**
> 输出这个文件是不慢的就是把内存里的buffer以及临时目录中的.jfr文件合并后输出。⚠注意不能把内存里的buffer配的过大否则可能会导致内存不足引发FullGC。
### JFR的内存占用
- thread buffer线程数量 * thread buffer 大小默认8kb
- global buffer总大小由【memorysize】自动计算得出
相加就是JFR的总内存占用。
### jcmd 命令启用JFR