gpt4 book ai didi

java - 鉴于 JFR promise 低开销,它如何设法记录堆栈跟踪?

转载 作者:行者123 更新时间:2023-11-30 07:39:56 24 4
gpt4 key购买 nike

通过 https://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-wp-2008279.pdf ,我遇到了以下引述:

Most technologies used today to monitor, manage, and profile the Java runtime use fairly intrusive technologies, like byte code instrumentation and JVMTI.

这让我想知道 JFR 进行堆栈跟踪采样的方式。

我在网上找到的最接近答案的是这篇博文:http://psy-lob-saw.blogspot.com/2016/06/the-pros-and-cons-of-agct.html , 提到 Honest profiler 和 async-profiler 等分析器使用的 AsyncGetCallTrace 文档不多,但事实是它没有提到 JFR 进行堆栈跟踪采样/记录的具体方式。

这里有人对 JFR 内部关于这个主题有任何见解吗?

最佳答案

JFR 维护一个周期性唤醒的线程,即每 10 毫秒唤醒一次,并通过发送信号暂停少量正在运行的 Java 线程。然后它遍历挂起线程的堆栈以查看正在执行的方法。它计算堆栈帧的散列,然后检查之前是否已找到该堆栈跟踪。

如果不是这种情况,它会将堆栈帧添加到哈希表并增加一个计数器,该计数器成为堆栈跟踪的 id。然后它将 id 作为 Execution Sample 事件发出,该事件最终出现在另一个线程定期刷新到磁盘的缓冲区(无锁)中。如果 id 是新的,它还会记下与该 id 对应的完整堆栈跟踪,因此堆栈跟踪可以稍后由解析器解析。

如果你想深入挖掘,你可以看看源代码。

http://hg.openjdk.java.net/jdk/jdk/file/tip/src/hotspot/share/jfr/periodic/sampling

线程如何挂起取决于平台。在以下文件中,您可以找到 Linux 实现。

http://hg.openjdk.java.net/jdk/jdk/file/tip/src/hotspot/os/linux/os_linux.cpp

关于java - 鉴于 JFR promise 低开销,它如何设法记录堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58663531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com