2013-04-01 6 views
8

VisualVMでJavaプログラムを監視しているときに、ガベージコレクタの動作に興味深いパターンがあることに気付きました。 '通常の'ガーベジコレクションを実行した直後に、GCは2番目に多くのCPU負荷がかかるため、追加の効果はないようです(より積極的に実行した後に使用されるヒープはそれはより軽いランの後である)。Javaガベージコレクタは、攻撃的ではない行動をした直後に積極的な実行を行うように見えるのはなぜですか?

VisualVMの出力で、ガベージコレクタの実行と対応するヒープ使用の変更がわかります。

interesting garbage collector behaviour

私の質問は基本的にあり、ここで、なぜやってガベージコレクタは何ですか?十分な空きメモリがあり、軽い実行と比較して目に見える利点がない場合、実際にこれらのCPU集約型実行を試みる原因は何ですか?あるいは私はグラフを誤解していますか?

プログラムのパフォーマンスは実際には影響を受けていません。私は興味があります。

+1

私はここで誰も "なぜ"に答えることができるだろうと思っています。見つかるにはJVMのソースコードを読んでおかなければならないでしょうし、いつでも変わるかもしれません。 –

+1

@JimGarrison質問に答えるのに十分なだけJVMで作業しているSOユーザーがいなければならないと感じています; – bdesham

答えて

2

GCの実行の概要を確認するのは良いことですが、特定の瞬間にGCが実行されている理由を調べたい場合は、にGCログを詳しく調べる必要があります。

完全なGCロギングを有効にするには、jstatの収集も開始します。予期しないGCサイクルが発生し、ログに戻ってそれらをトレースする時間に注目してください。そこには何が見えますか?試してみてください:

  • それは完全またはマイナーなGCですか?
  • eden、perm、oldGen、survivor spacesなどの職業は何ですか?
  • 割り当て率、ライブデータセットサイズ、その間隔でのプロモーション率はどのくらいですか?これらの質問に答える
  • など

は、GCが実行されている理由の問題にあなたを導くことができました。

更新日:GCのハウツー調整に関する技術的な詳細を見つけることができます。 in:Is there a cookbook guide for GC problems?

+1

これを少し拡張するには、-verbose:gcと-XX:+ PrintGCDetailsを使って本当にこれをさらに深く掘り下げる。 –

+1

GCの詳細については、VisualVMのVisualGCプラグインを試してみてください。 –

関連する問題