JFR 执行示例与线程转储

JFR ExecutionSample vs ThreadDump

  1. 如果我需要使用 JFR 执行 Java 分析,最好使用什么: ExecutionSample 事件每 X 毫秒或 ThreadDump 事件每 X 毫秒?
  2. 有什么方法可以让 ExecutionSample 事件 and/or ThreadDump 事件仅针对特定线程而不是针对所有线程?
  1. 如果您想对 Java 个线程进行采样,您应该使用 jdk.ExecutionSample,因为开销会低得多。

  2. 无法将 jdk.ThreadDump 配置为仅记录单个线程,或者 jdk.ExecutionSample 同时对所有线程进行采样。

说明

负责发出 jdk.ExecutionSample 的采样器周期性地挂起一个 Java 线程并遍历其堆栈,但所有其他线程可以保持 运行。堆栈跟踪存储为 ID,因此如果重复,只需重写几个字节。

jdk.ThreadDump 事件的实施将所有 Java 线程带到安全点,这意味着应用程序将完全停止。 运行 Java 线程只会在生成的机器代码中安全点轮询所在的位置停止。这意味着采样将不那么准确。当所有线程都停止时,所有堆栈都由一个线程遍历,这意味着其他内核将等待。结果以文本形式写入,因此如果多次出现相同的堆栈跟踪,则需要重写所有帧。