私のアプリケーションは、16 個のプロセッサと 64 GB の RAM を搭載したサーバーで正しく動作します。複数のプロセスがあり、プロセスの最大ヒープを 8 GB に制限しようとしています。
私の問題は、何らかの形の生産者と消費者のパターンがあり、生産速度を制限する必要があることです。そうしないと、古い世代のガベージ コレクションがほとんど発生しないため、メモリが不足します。
- アプリケーションを監視すると、4 時間実行した後、ParNEW で 7 分、ConcurrentMarkSweep で 0.775 秒を費やしたことがわかります。
- 私のヒープ占有率は最大で約 6GB になり、その後 1GB まで低下し、ゆっくりと 6GB まで上昇してから再び低下します。サイクルは約10分です
JVisualVM を介して、メモリ占有の 90% が CMS Old Gen によって与えられていることがわかります。どうすれば、並行マーク スイープをもう少し頻繁に実行するように強制できますか?
@PeterLawrey のコメントは非常に関連性があります。私のアプリケーションは、Terracotta や Coherence などのイベント駆動型処理とデータ パーティション分割用に設計されたアプリケーション サーバー上で実行されるからです。基礎となる実装には、イベント処理用のキューイング システムが含まれている可能性があります。
私の問題は、ヒープ サイズを制限することは解決策ではないということです。私が経験したように、より頻繁にガベージ コレクションを行う代わりに、アプリケーションがメモリ不足になるからです。