有人问here类似的问题。
我正在使用根据instructions构建的JMC 7.1.0对Open JDK 11.0.2应用程序进行性能分析。
该应用程序使用了大约3个内核,没有过多的gc,只有一小部分线程正在执行实际上利用CPU的本机方法调用。
我正在使用默认方法10ms的采样间隔。 我通过使用以下命令在安全点之外启用了调试元数据:
-XX:+ UnlockDiagnosticVMOptions -XX:+ DebugNonSafepoints
抽取的样本数量比我预期的少得多。 保守地假设在每个采样点上运行非本机代码的cpu线程上有1个,我期望每秒100个采样。但是我每秒只能看到1个样本。
机器本身通常处于50%空闲状态,因此采样线程不会饿死。
是什么原因导致样本数量如此之低?
答案 0 :(得分:1)
这可能是由于JDK 11中引入的一个错误,该错误出现在具有多个线程的应用程序中。它已在JDK 12中修复,并反向移植到11.0.3。
有关详细信息,请参见:
https://bugs.openjdk.java.net/browse/JDK-8215727
关于采样间隔。默认速率为20毫秒,但这并不意味着将有50个样本/秒。这是JVM尝试采样一个或更多线程的时间间隔。