gpt4 book ai didi

java - 为什么 HotSpot ExecutionSample 事件总是返回 STATE_RUNNABLE?

转载 作者:行者123 更新时间:2023-12-02 17:59:09 25 4
gpt4 key购买 nike

我正在使用ExecutionSample event来自 OpenJDK11 中的 HotSpot。

它有一个线程状态字段,但我只看到该字段的一个值:STATE_RUNNABLE

HotSpot 如何选择要采样的线程?为什么它们总是可以运行?

Kotlin 中的简单复制代码:

import jdk.jfr.Recording
import jdk.jfr.consumer.RecordingFile
import java.nio.file.Path

object ExecutionSampleTest {

private const val EXECUTION_SAMPLE = "jdk.ExecutionSample"
private val RECORDING_PATH = Path.of("/tmp/recording.jfr")

@JvmStatic
fun main(args: Array<String>) {
Recording().use { recording ->
recording.enable(EXECUTION_SAMPLE)
recording.settings = recording.settings.plus("$EXECUTION_SAMPLE#period" to "1 ms")

recording.start()
repeat(100) {
// start some sleeping threads, just so we've got something to sample
Thread { Thread.sleep(20_000) }.start()
}
Thread.sleep(20_000)
recording.stop()
recording.dump(RECORDING_PATH)

RecordingFile.readAllEvents(RECORDING_PATH).forEach {
println("Thread state: ${it.getString("state")}")
}
}
}
}

仅打印:线程状态:STATE_RUNNABLE

最佳答案

Why does the HotSpot ExecutionSample event always return STATE_RUNNABLE?

按设计。

JFR 方法分析器定期对 Java 线程进行采样并生成两种类型的事件:

  • ExecutionSample,当线程状态为 in_java
  • NativeMethodSample,当线程状态为 in_native

参见jfrThreadSampler.cpp源代码:

  if (JAVA_SAMPLE == type) {
if (thread_state_in_java(thread)) {
ret = sample_thread_in_java(thread, frames, max_frames);
}
} else {
assert(NATIVE_SAMPLE == type, "invariant");
if (thread_state_in_native(thread)) {
ret = sample_thread_in_native(thread, frames, max_frames);
}
}

in_javain_native都对应JFR格式的STATE_RUNNABLE

当线程由于任一原因(STATE_SLEEPINGSTATE_PARKED 等)而无法运行时,其 JVM 状态为 thread_blocked。但是,JFR 方法探查器根本不会对阻塞线程进行采样。

<小时/>

如果您对挂钟分析感兴趣(即对所有线程进行采样,无论它们在 CPU 上运行还是在 sleep 状态下运行),您可能需要查看 async-profiler 。 Async-profiler 还可以以 JFR 兼容格式生成输出,但与 JFR 不同的是,它为 RUNNABLE 和 IDLE 线程生成 ExecutionSample 事件。

关于java - 为什么 HotSpot ExecutionSample 事件总是返回 STATE_RUNNABLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60156403/

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