Java Mission Control 空格是啥意思?
Posted
技术标签:
【中文标题】Java Mission Control 空格是啥意思?【英文标题】: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、异常、外观、等待时间,我的代码运行速度非常快。
我尝试运行它几次,但得到了相同的结果。为什么会这样?
操作系统 - 窗口
【问题讨论】:
您是在分析还是采样? 你是说操作系统吗?是窗户 【参考方案1】:在对应用程序进行采样(而不是全面分析)时,分析器会以一定的时间间隔进行检查以查看正在运行的方法。这使得它比跟踪每次调用更轻松。
这也意味着您无法获得准确的结果(您可能不需要),例如调用计数。您可能认为代码只运行了40
次,但实际上这只是分析器检测到该方法正在运行的次数。虽然没有采样的一秒钟似乎很长一段时间,但采样器可能只是没有机会运行(尤其是如果您的循环很紧并且在低端机器上运行)。
虽然采样不能为您提供准确的调用计数,但它确实为您提供了足够的信息来确定哪些方法使用最多的时间和 CPU,因此您可以优化代码。
【讨论】:
【参考方案2】:调用太少,JFR 采样分配和方法调用以保持低开销。它大约每 10 毫秒对堆栈进行一次采样,并在每个 TLAB(线程本地分配缓冲区)或分配大对象时进行分配。
JIT 编译器也可以消除分配/调用,但它通常需要 40 多次调用才能发生。
【讨论】:
我不认为 JIT 编译器消除了调用,因为我把这一行 msgSeqNum = message.getMsgSeqNum(); msgSeqNum 是全局变量。我不确定这是避免淘汰的正确方法,您怎么看?以上是关于Java Mission Control 空格是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Java Mission Control - 访问被拒绝连接到远程
Java Mission Control:飞行记录器抛出:javax.naming.ServiceUnavailableException
Java Mission Control Flight Recorder 中没有记录 CPU 使用情况
仍然可以使用 Java Mission Control 连接到远程 JMX 但证书已过期?