JFR 中 RecordedFile 的调用堆栈是否完整?

问题描述

在使用 Java Flight Recorder 进行记录的持续时间内,在该持续时间内调用的所有方法是否都将列在 RecordedFile 中?

鉴于:

  • 我没有记录事件的子集。
  • 我没有创建任何自定义事件。
  • 我使用的是 AdoptOpenJDK 11.0.10

提前感谢您的回答。

解决方法

没有

首先,JFR 是一个采样分析器。它不记录所有方法转换;相反,它需要定期采样。 IE。一次在指定的时间间隔内,它会查看当前正在运行的线程的调用堆栈。

第二,当 JFR fails to traverse 是一个有效的 Java 堆栈时,它往往会遗漏很多样本。我在 my presentation 中演示了这种效果:JFR 在 10 秒的执行中只捕获了一个无意义的应用程序堆栈跟踪。

您可以通过调整采样 period 设置来选择 JFR 收集的样本数量。周期越小 - JFR 收集的堆栈样本越多。但是,可能的最小周期仅为 1 ms。此外,采样频率不能很好地与运行线程的数量成比例。无论您的服务器有多少个内核,只有一个线程可以收集所有 ExecutionSample 事件。