2017-04-21 11 views
2

私は自分のクラスをプロファイルしたい、それは私のユーザーのデータを保存し、それを取得するバッファのようなものです。私はmainメソッドを作成してそこの無限のサイクルでテストメソッドを実行しました。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

運用システムですか?それは窓だった – ViKo

答えて

2

(本格的プロファイリングとは反対に)サンプリングアプリケーションは、プロファイラは、一定の間隔でチェックはメソッドが実行されているかを確認することができます。これにより、すべての単一の呼び出しを追跡するよりも軽くなります。

これは、呼び出し回数などの場合、正確な結果(おそらく必要ない)が得られないことを意味します。コードは40回しか実行されていなかったと思うかもしれませんが、実際には、プロファイラがそのメソッドが実行されたことを何回検出したのでしょうか。サンプルを一切取らずに2番目のサンプルは長い時間のように見えますが、サンプラーは実行する機会がありませんでした(特にループが狭く、ローエンドのマシンで動作している場合)。

サンプリングで正確な呼び出し回数が得られるわけではありませんが、どのメソッドがほとんどの時間とCPUを使用しているかを判断するのに十分な情報が得られますので、コードを最適化できます。

0

オーバーヘッドを低く抑えるために、JFRサンプル割り当てとメソッド呼び出しが少なすぎます。これは、スタックを約10msごとに1回サンプリングし、すべてのTLAB(スレッドローカル割り当てバッファ)で割り当てを行います。

JITコンパイラでは、割り当て/呼び出しを削除することもできますが、通常は40回以上の呼び出しが必要です。

+0

私はこの行を置くので、私はJITコンパイラが呼び出しを消したとは思わない。msgSeqNum = message.getMsgSeqNum(); msgSeqNumはグローバル変数です。私はそれが排除を避ける正しい方法であるとは確信していません、あなたはどう思いますか? – ViKo

関連する問題