私はアプリケーションに、基本的に、新しいバイト配列 (1K 未満) を作成し、数秒 (通常は 1 分未満ですが、一部のデータは最大 1 時間保存されます) 後にデータをディスクに書き込み、データはゴミになります。1 秒あたり約 400 パケットが作成されました。GC について特に心配する必要はないという記事をいくつか読みましたが、特にメモリ部分をすばやく作成して解放しました (Java 6 で)。GC の実行時間が長すぎると、アプリケーションで問題が発生します。いくつかの GC パラメータ (より大きな XMX と ParallelGC) を設定しました。これにより、完全な GC 時間は減少しますが、まだ十分ではありません。私は2つの考えを持っています.GCパラメータに焦点を合わせていますか、それともバイト配列メモリプールメカニズムを作成していますか? どちらの方がよいですか?
3 に答える
GC を実行する頻度はオブジェクトのサイズに依存しますが、コスト (クリーンアップ時間) はオブジェクトの数に大きく依存します。古い空間に行き着き、最終的に破棄されるまで、長寿命の配列が空間間でコピーされているのではないかと思います。古い世代のクリーニングは比較的高価です。
ByteBuffer を使用してデータを保存することをお勧めします。これらは byte[] に似ていますが、可変サイズであり、NIO でダイレクト バイト バッファーを使用できる場合は、わずかに効率的です。バッファを事前に割り当てると、バッファを事前に割り当てるのがより効率的になります。(ただし、仮想メモリを浪費する可能性があります)
ところで: ダイレクト バイト バッファは、"C" 空間のメモリを使用するため、ヒープ領域をほとんど使用しません。
- プロファイラーを使用してコードスニペットを識別します
- WeakReferencesを試してください。
- VMにGCアルゴリズムを提案する
-Xgc: parallel
- 大きなヒープを設定し、共有メモリ
-XX:+UseISM -XX:+AggressiveHeap
- ガベージコレクションについては、以下に設定します。
-XX:SurvivorRatio 8
GC が十分に機能していない理由を分析することをお勧めします。を使用jmap
してヒープをダンプし、jhat
Eclipseメモリ アナライザーを使用して、そこに存在するオブジェクトを確認できます。不要になった参照を保持していることに気付く場合があります。
GC は非常に巧妙であり、独自のメモリ管理コードで GC の裏をかこうとすると、事態が悪化する可能性があります。パラメータを調整してみてください。新しい G1 ガベージ コレクタも試すことができるかもしれません。
また、GC は短命で不変のオブジェクトを好むことを覚えておいてください。