CMS コレクターがオブジェクトの昇格率に追いついていないということは、GC ログに「同時モードの失敗」が表示されるはずであることを意味します。これらは、CMS コレクターが「競合に負け」、完了する前にメモリが不足した場合に得られるものです。
2014-02-27T01:09:52.408-0600: 847.004: [GC 847.005: [ParNew
(promotion failed)
Desired survivor size 78512128 bytes, new threshold 2 (max 15)
- age 1: 60284680 bytes, 60284680 total
- age 2: 32342648 bytes, 92627328 total
: 1380096K->1380096K(1380096K), 0.7375510 secs]847.743:
[CMS2014-02-27T01:09:54.133-0600: 848.729: [CMS-concurrent-s
weep: 5.467/6.765 secs] [Times: user=21.59 sys=0.73, real=6.76
secs]
(concurrent mode failure): 2363866K->1763900K(4409856K),
10.6658960 secs] 3697627K->1763900K(5789952K), [CMS Perm :
118666K->117980K(125596K)], 11.4061610 secs]
[Times: user=11.34 sys=0.02, real=11.57 secs]
デフォルトでは、旧世代では CMS コレクターは占有率 92% でトリガーされます。古い世代の使用状況のグラフのメモリ増加率から判断すると、5 分ごとに約 500 MB 増加しています。6GB の 92% で約 500 MB のヘッドルームが得られます。これは、CMS が 5 分以内にレースに勝たなければならないことを意味します。そうでもなければ...
...グラフに表示されているスムーズなトラフィック プロファイル以外に、舞台裏で何かが起こっています。たとえば、キャッシュなどのメモリ内データ構造を更新するバックグラウンド プロセスはありますか? これらのタイプのアクティビティは、古い世代に昇格する必要がある、長期間有効な新しいオブジェクトを突然大量に作成します。滑らかなグラフが突然垂直になり、使用可能なメモリがすぐに使い果たされる可能性があります。CMS コレクタは、スムーズで安定したトラフィックの処理に優れていますが、アクティビティの急激なバーストに対して非常に脆弱です。ガベージ生成率の緩やかな変化に対応するのは得意ですが、「バースト」動作を予測できず、このような競合に負けるケースを数多く見てきました。
新しいオブジェクトの突然のバーストを生成するバックグラウンド プロセスを完全に回避することとは別に、CMSInitiatingOccupancyFraction パラメーターをデフォルトの 92% ではなく 60 ~ 80 の間に減らすことで、CMS コレクターに有利なスタートを切ることができます。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms.starting_a_cycle
また、PermGen スペースにも注意してください。Parallel Throughput Collector とは異なり、CMS コレクターはデフォルトで PermGen を収集しないため、PermGen がいっぱいになると、ストップ ザ ワールド フル GC になります。このパラメーターにより、CMS コレクターは PermGen スペースも収集します: CMSClassUnloadingEnabled。
それ以外では、GC ロギングと設定をオンにすることをお勧めします: -XX:+PrintGCDetails は、すべてのマイナーおよびメジャー ガベージ コレクションの詳細を出力します。
これは、起動時にすべての JVM 設定を確認できる優れたパラメーターです。 -XX:+PrintFlagsFinal は、起動時にすべての JVM 構成オプションの値を出力します。