我想对我的类进行概要分析,它就像一个缓冲区,在其中保存用户数据并在以后获取它。我已经创建了main方法并在那里无休止地运行测试方法。

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


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

我对它进行了30秒的分析,但是正如我所看到的那样,我的代码运行了大约40次(我期望有几千次)。我还看到了JMC中的空格(请参见screenshot),这表明我的JVM没有执行任何操作。没有GC,异常,外观,等待时间,我的代码运行非常快。

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

操作系统-Windows

最佳答案

在对应用程序进行采样(而不是完全剖析)时,探查器会按一定的间隔进行检查,以查看正在运行的方法。这比跟踪每个单个调用轻。

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

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

08-16 08:14