2

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

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

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

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

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

操作系统 - 窗口

4

2 回答 2

3

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

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

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

于 2017-04-21T13:35:33.797 回答
1

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

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

于 2017-04-24T06:14:16.443 回答