![]() 上一页 |
![]() 下一页 |
JFR 从 JVM (通过内部 API) 和 Java 应用程序 (通过 JFR API) 收集数据。此数据存储在小型线程本地的缓冲区中,这些缓冲区会刷新到内存中的全局缓冲区。接下来,内存中的全局缓冲区内的数据将写入到磁盘。磁盘写入操作开销很高,因此应该仔细选择需要启用记录的事件数据,尽可能地减少写入操作。二进制格式的记录文件非常紧凑,应用程序可以高效地读取和写入。
不同缓冲区之间没有信息重叠。具体数据块将只在内存或磁盘上可用,但永远不会同时在两处可用。这样会有以下隐患:
在出现电源故障后,尚未刷新到磁盘缓冲区的数据将不可用。
JVM 崩溃会导致一些数据在核心文件中 (即内存中缓冲区),而另一些数据在磁盘缓冲区中。JFR 不提供合并这些缓冲区的功能。
JFR 收集的数据在对您可用之前,可能略有延迟 (例如,数据需要移动到其他缓冲区才能变得可见时)。
记录文件中的数据可能未按时间顺序排列,因为数据是从多个线程缓冲区以数据块的形式收集的。
在某些情况下,JVM 会丢弃事件顺序以确保不会崩溃。任何无法快速写入磁盘的数据将会放弃。发生这种情况时,记录文件中将包含受影响时段的相关信息。此信息也会记录到 JVM 的日志记录工具中。
您可以配置 JFR 以便不将任何数据写入磁盘。在此模式中,全局缓冲区起到了循环缓冲区的作用,在缓冲区变满时删除最早的数据。这种开销极低的操作模式仍会收集问题根本原因分析所需的全部关键数据。由于最近的数据始终在全局缓冲区中可用,只要操作或监视系统检测到问题,这些数据可以根据需要写入磁盘。但是,在这种模式下,只有最近几分钟的数据可用,因此只包含最新的事件。如果需要获取时间段较长的完整操作历史记录,请使用定期将数据写入磁盘的默认模式。