Java Mission Control 空格是什么意思?

Java Mission Control what do the spaces mean?

我想分析我的 class,它就像一个缓冲区,我在其中保存我的用户数据并在之后获取它。我已经在无限循环中创建了 main 方法和 运行 测试方法。

    public void test(){
       buffer.add(n1);
       Message message = buffer.remove();
       msgSeqNum = message.getMsgSeqNum();
    }

msgSeqNum 是全局变量,为了让 JVM 不删除我的调用,我做了它(我认为它可以帮助我)。

我分析了它 30 秒,但正如我所见,我的代码 运行 大约 40 次(我预计有几千次)。我还在 JMC 中看到了空格(请参阅 screenshot),这表明我的 JVM 什么也没做。没有 GC、异常、外观、等待时间,我的代码运行速度非常快。

我尝试 运行 几次,但我得到了相同的结果。为什么会这样?

OS - windows

在对应用程序进行采样(而不是全面分析)时,分析器会以特定的时间间隔进行检查,以查看正在使用哪些方法 运行。这比跟踪每次调用更轻松。

这也意味着您无法获得诸如调用计数之类的准确结果(您可能不需要)。您可能认为该代码仅 运行 次 40 次,但实际上这就是探查器检测到该方法 运行 的次数。虽然一秒钟没有采集任何样本确实看起来很长一段时间,也许采样器只是没有机会 运行(特别是如果你有一个紧密的循环并且 运行 宁在低端机)。

虽然采样不会为您提供准确的调用计数,但它确实为您提供了足够的信息来确定哪些方法使用的时间最多 CPU,因此您可以优化代码。

调用太少,JFR 对分配和方法调用进行采样以保持低开销。它大约每 10 毫秒对堆栈进行一次采样,并在每个 TLAB(线程本地分配缓冲区)或分配大对象时进行分配。

JIT 编译器也可能会消除 allocation/invocation,但它通常需要 40 多次调用才能发生。