【问题标题】:Java Mission Control what do the spaces mean?Java Mission Control 空格是什么意思?
【发布时间】:2017-04-21 13:06:16
【问题描述】:

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

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

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

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

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

操作系统 - 窗口

【问题讨论】:

  • 您是在分析还是采样?
  • 你是说操作系统吗?是窗户

标签: java performance profiling jmc jfr


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不认为 JIT 编译器消除了调用,因为我把这一行 msgSeqNum = message.getMsgSeqNum(); msgSeqNum 是全局变量。我不确定这是避免淘汰的正确方法,您怎么看?
    猜你喜欢
    • 2014-06-28
    • 2016-04-27
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2014-07-26
    • 2013-09-19
    相关资源
    最近更新 更多