![]() 上一页 |
![]() 下一页 |
图:Java 飞行记录器数据流显示数据在 JFR 中的流动方式。
数据由 JVM (通过内部 API) 和 Java 应用程序 (通过飞行记录器 API) 发送到飞行记录器。飞行记录器运行时将此数据存储在小型的线程本地缓冲区中,这些缓冲区已满时会将数据刷新到内存中的全局缓冲区。飞行记录器在永久存储模式下运行时,内存的全局缓冲区中的数据将在这些缓冲区已满时写入到磁盘中。
不同缓冲区之间不会发生信息重叠。具体数据块将只在内存或磁盘上可用,但永远不会同时可用。这样会有以下隐患:
在出现电源故障后,尚未刷新到磁盘缓冲区的数据将不可用。
JVM 崩溃会导致一些数据在核心文件中 (即内存中缓冲区),而另一些数据在磁盘缓冲区中。飞行记录器无法合并这些缓冲区 (高级客户机程序或工具或许具有此功能,但这一点不在此版本的讨论范围之内)。
插入飞行记录器的数据在提供给使用者之前,可能略有延迟 (例如,因为数据需要移动到其他缓冲区才能变得可见)。
JFR 文件中的数据可能未按时间顺序排列,因为数据是从多个线程缓冲区以数据块的形式收集的。
在一些极端情况下,HotSpot 将丢弃事件顺序,以便不阻止 JVM 继续运行。此时将放弃无法快速写入磁盘的任何数据。发生这种情况时,记录文件中将包含受影响时段的相关信息。此信息也会记录到 JVM 的日志记录工具中。