7

現在、最大ヒープ サイズ 16GB を必要とするアプリケーションを実行しています。

現在、次のフラグを使用してガベージ コレクションを処理しています。

-XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=50, -XX\:+DisableExplicitGC, -XX\:+PrintGCDateStamps, -XX\:+PrintGCDetails, -Xloggc\:/home/user/logs/gc.log

ただし、いくつかのガベージ コレクション中に、アプリケーションが数秒間ロックしてから続行することに気付きました。これはゲーム サーバーであるため、まったく容認できません。

私のガベージ コレクション ログからの出力は、ここにあります。

これらの長い一時停止を減らすために何を変更する必要があるかについてのアドバイスをいただければ幸いです。

4

4 に答える 4

5

これらの長い一時停止を減らすために何を変更する必要があるかについてのアドバイスをいただければ幸いです。

システムが生成するガベージの量に CMS GC が対応できない可能性があります。しかし、GC が実行しなければならない作業は、実際には、システムが保持している非ガベージの量により密接に関連しています。

そう ...

  • アプリケーションの実際のメモリ使用量を減らすようにしてください。たとえば、あまり多くのものをキャッシュしないか、「世界」のサイズを縮小します。
  • アプリケーションがガベージを生成する速度を下げるようにしてください。
  • より多くのコアを備えたマシンにアップグレードして、必要に応じて並列 GC スレッドを実行するためにより多くのコアを使用できるようにします。

ミスティカルへ:

はい、後から考えると、C++ でサーバーを実装するほうがよかったかもしれません。しかし、私たちは「ゲーム」について何も知りません。複雑な異種データ構造を持つ複雑な世界モデルが関係している場合、C++ で実装することは、「GC 一時停止」の問題を、データの管理方法の問題によりサーバーが常にクラッシュするという問題に置き換えることを意味する可能性があります。構造。

于 2013-03-29T03:13:17.767 に答える
2

私は Java ガベージ コレクションの専門家ではありませんが、サーバーに複数のプロセッサがあると仮定すると、コンカレント コレクター (UseConcMarkSweepGC フラグ) を使用して正しいことをしているように見えます。http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cmsにあるトラブルシューティングの提案に従ってください。すでに持っている場合は、それらを試したときに何が起こったのか教えてください.

于 2013-03-29T04:48:31.487 に答える
1

どのバージョンの Java を使用していますか? http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html クラスでのインスタンス変数の使用を最小限に抑えるようにしてください。インスタンスよりもローカル変数で実行する方がよいでしょう変数。これは、パフォーマンスを向上させ、同期の問題から安全にするのに役立ちます。インスタンス変数を使用している場合は、プログラムの終了前に操作の最後に使用された変数を常にリセットし、必要に応じて再度設定します。パフォーマンスの向上にさらに役立ちます。Java のバージョンに加えて、優れたガベージ コレクション ポリシーが実装されています。それが可能であれば、新しいバージョンに移行することをお勧めします。また、VisualVm を介してガベージ コレクターの一時停止時間を監視することもでき、より多くのガベージ コレクションがいつ実行されているかを把握できます。

于 2013-03-29T04:01:07.300 に答える