2017-04-21 211 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