diff --git a/初识JFR.md b/初识JFR.md index 6e4ba55..a6be277 100644 --- a/初识JFR.md +++ b/初识JFR.md @@ -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