更新 JFR参数详解.md
This commit is contained in:
parent
e24bde82eb
commit
d52d4b0328
25
JFR参数详解.md
25
JFR参数详解.md
@ -1,3 +1,7 @@
|
||||
### 出处
|
||||
|
||||
[文章出处](https://zhuanlan.zhihu.com/c_1264859821121355776) [关注大佬](https://www.zhihu.com/people/zhxhash) 我只是对大佬的文章内容做一个笔记,加深记忆和理解。
|
||||
|
||||
### 什么是JFR?
|
||||
JFR是**Java Flight Record**(Java飞行记录)的缩写,是JVM内置的基于事件的监控记录框架。这个起名参考了黑匣子对于飞机的作用,将Java进程比喻成飞机飞行。顾名思义,JFR主要用于问题定位和持续监控。
|
||||
|
||||
@ -48,5 +52,24 @@ Event 会被写入`.jfr`的二进制文件中,以`little endian base 128`的
|
||||
|
||||
> 实际使用中,通过可视化工具**JMC**查看`.jfr`文件
|
||||
|
||||
### JFR如何实现的低延迟与低性能损耗
|
||||
### 如何实现的低延迟、低性能损耗?
|
||||
|
||||
Event 是多线程产生的,如果 Event 记录要保证全局有序,那么肯定需要多线程向一个指定队列或者缓存输出,那么不可避免的会涉及到锁争用,这样是很低效的。而 Event 本身带时间戳,所以记录时不需要排序,将每个线程内的记录,合并成一个集合后再进行排序高效得多。
|
||||
|
||||
<img src='https://pic3.zhimg.com/v2-5530b8a77d0d45ac12dd879ccf7afce8_1440w.jpg'/>
|
||||
|
||||
1. 所有的 Event 会先存储到每个线程自己的 Thread Buffer(默认8KB,这是一个经验值)
|
||||
2. Thread Buffer 满了之后刷入 Global Buffer(可配置)
|
||||
3. Global Buffer 满了之后会选择丢弃或者刷入文件(可配置)
|
||||
|
||||
*Thread Buffer 中的数据要么在内存中,要么就在磁盘里。不会两个地方都存在。*
|
||||
|
||||
#### JFR记录数据丢失?
|
||||
|
||||
- 断电、操作系统强制重启
|
||||
- kill -9 了 Java 进程
|
||||
- JVM 崩溃
|
||||
|
||||
刷入文件的 Event 不会丢,但 Global Buffer、Thread Buffer 会丢失。正常退出、应用异常但JVM正常退出的,数据不会丢。数据在从 Thread Buffer 刷入 Global Bufeer 的时候, 如果去 dump JFR 的数据,*可能这部分数据会被忽略而导致看不到。 *
|
||||
|
||||
*从 Global Buffer 刷入磁盘不够快的时候,这时候要刷入磁盘的数据可能被丢弃。*当发生这种情况时,会记录下数据丢失事件,这个事件包括是哪块时间的数据丢掉了。通过 JFR 的日志也能看到这个信息。
|
Loading…
Reference in New Issue
Block a user