4

此处提出了类似的问题。

我正在使用根据说明构建的 JMC 7.1.0 分析 Open JDK 11.0.2 应用程序。

该应用程序使用了大约 3 个内核,没有过多的 gc,并且只有一小部分时间线程正在执行实际使用 CPU 的本机方法调用。

我使用的是 10 毫秒的默认方法采样间隔。我使用以下方法启用了安全点之外的调试元数据:

-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints

采集的样本数量比我预期的要少得多。保守地假设在每个采样点有 1 个运行非本机代码的 cpu 线程,我预计每秒 100 个样本。然而,我只看到 1 个样本/秒。

cpu 使用和方法示例

机器本身通常有 50% 空闲,所以采样线程不会被饿死。

是什么导致样本数量如此之低?

4

1 回答 1

2

这可能是由于 JDK 11 中引入的错误导致的,该错误出现在具有多线程的应用程序中。它已在 JDK 12 中修复并向后移植到 11.0.3。

详情见:

https://bugs.openjdk.java.net/browse/JDK-8215727

关于采样间隔。默认速率为 20 毫秒,但这并不意味着会有 50 个样本/秒。这是 JVM 尝试对一个或多个线程进行采样的时间间隔。

于 2019-03-20T06:39:13.480 回答