【发布时间】:2021-12-25 23:53:21
【问题描述】:
- 如果我需要使用 JFR 执行 Java 分析,最好使用什么: ExecutionSample 事件每 X 毫秒或 ThreadDump 事件每 X 毫秒?
- 有没有办法让 ExecutionSample 事件和/或 ThreadDump 事件只针对特定线程而不是针对所有线程?
【问题讨论】:
标签: profiling thread-dump jfr
【问题讨论】:
标签: profiling thread-dump jfr
如果要对 Java 线程进行采样,则应使用 jdk.ExecutionSample,因为开销会低得多。
无法将 jdk.ThreadDump 配置为只记录单个线程,或者让 jdk.ExecutionSample 同时对所有线程进行采样。
说明
负责发出 jdk.ExecutionSample 的采样器会定期挂起 Java 线程并遍历其堆栈,但所有其他线程可以继续运行。堆栈跟踪存储为 ID,因此如果重复,只需重写几个字节。
jdk.ThreadDump 事件的实现将所有 Java 线程带到一个安全点,这意味着应用程序将完全停止。运行 Java 线程只会在生成的机器代码中安全点轮询所在的位置停止。这意味着采样不会那么准确。当所有线程都停止时,所有堆栈都由一个线程遍历,这意味着其他内核将等待。结果以文本形式写入,因此如果多次出现相同的堆栈跟踪,则需要重写所有帧。
【讨论】: