2017-04-21 205 views
2

我想剖析我的类,它就像是一个缓冲区,在那里我保存用户的数据并获取它。我创建了主要方法,并在那里的无限循环中运行测试方法。Java Mission Control空间是什么意思?

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

msgSeqNum是全局变量,我将它以JVM不要删除我的电话(我认为它可以帮助我)。

我正在分析它30秒,但正如我所看到的,我的代码运行了大约40次(我预计会有几千次)。我还看到了JMC中的空间(请参阅screenshot),它们向我展示了我的JVM什么都不做。没有GC,例外,外观,等待时间,我的代码工作非常快。

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

OS - 窗户

+0

你是在分析还是抽样? – Kayaman

+0

你的意思是操作系统?这是Windows – ViKo

回答

2

抽样时(而不是完全成熟的分析)的应用,分析器使得在一定的时间间隔检查以查看什么方法都正在运行。这使得它比追踪每一个调用更轻。

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

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

0

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

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

+0

我不认为JIT编译器消除了调用,因为我把这一行msgSeqNum = message.getMsgSeqNum(); msgSeqNum是全局变量。我不确定这是否是避免排除的正确方法,您怎么看? – ViKo