Java Mission Control空格意味着什么?

时间:2017-04-21 13:06:16

标签: java performance profiling jmc jfr

我想描述我的类,它就像一个缓冲区,我保存用户的数据然后得到它。我已经创建了main方法并在那里以无限循环运行测试方法。

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

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

我正在分析它30秒,但我可以看到我的代码运行了大约40次(我预计会有几千)。我还看到JMC中的空格(参见screenshot),它告诉我我的JVM什么也没做。没有GC,例外,外观,等待时间,我的代码工作得非常快。

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

OS - windows

2 个答案:

答案 0 :(得分:3)

当对应用程序进行采样(而不是完整的分析)时,分析器会以特定的间隔进行检查,以查看正在运行的方法。这使得它比跟踪每次调用都要轻。

这也意味着您无法获得准确的结果(您可能不需要),例如调用计数。您可能认为代码仅运行40次,但事实上,这只是探查器检测到该方法运行的次数。虽然没有采样的第二个确实看起来很长时间,但是采样器可能没有机会运行(特别是如果你有一个紧凑的循环并且在低端机器上运行)。

虽然采样并没有为您提供精确的调用计数,但它确实为您提供了足够的信息来确定哪些方法占用了大部分时间和CPU,因此您可以优化代码。

答案 1 :(得分:1)

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

JIT编译器也可以消除分配/调用,但它通常需要超过40次调用才能发生。