2012-02-23 10 views
6

1つのLinuxボックスで複数のサーバープロセスのインスタンスを実行しています。ボックスには8コアと16GBのRAMがあります。 Java 1.6を使用して、-Xincgcオプションを使用して各プロセスを起動します。JavaガベージコレクションはすべてのJavaプロセスを停止します

さまざまなタスクを完了するための時間を追跡する、アプリケーション全体で計測されたさまざまなタイマーがあります。ガベージコレクションが発生すると、その時に実行されていたタスクが遅いというボックスのすべてのJavaプロセスが表示されることがわかりました。

これは長時間停止していないかもしれません。おそらく100〜300ms程度ですが、レイテンシはこれの大きな要因です。また、定期的に停止しているわけでもありません。

ガベージコレクションが実行されているときに、Javaプロセスがいつでも停止することはありませんか?もしそうなら、これを回避する方法はありますか?別のGCオプションを使用する必要がありますか?

UPDATE:

ただ、明確にするためにGCが発生している間、私は1つのプロセスのストールについて心配していません。私は設定を微調整したり、その場合に最適化することができます。私は、Javaプロセスを実行しているときに、いつもそれが多かれ少なかれ独立していると思ったときに、同時に停止するように思えるのかと思っています。

+0

GCは本当にすべてのプロセスを停止べきではありません。また、[GCチューニングガイド](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html)も参照してください。 Java 6のデフォルトのガベージコレクタは、処理時間に最適化されたパラレルGCであり、休止時間ではありません。コンカレントコレクタは、より適しています。 – millimoose

+0

オブジェクトプーリングを検討することをお勧めします。これは、起こっているGCの量を減らす1つの方法です。 –

+1

@Guaranteed:独立したJVMを実行していて、1つのJVMが完全なGCを実行すると、1つのJVMがすべて影響を受けますか?あなたはこれを説明していますか? – TacticalCoder

答えて

0

GC待機時間は、Javaなどのガベージコレクション言語に固有の問題の1つです。これは、株式取引システムのような高速システムがJavaやC#ではなくC++で書かれている理由の1つです。大規模なGC操作の場合、約100msの音が鳴ります。

+2

これはどのようにして質問に答えますか?これは、はい、OPが実際に起こっていることです。私たちはすでにそれを知っています。 – millimoose

+0

私はこの質問が複数のプロセス*が同時に停止していると考えています。 – delnan

+0

@Mike Thomsen:C++で書かれた高頻度取引アルゴス? Pfft ...それは本当にsslloowwです!今は直接ハードウェア記述言語/ FPGAです! ; ) – TacticalCoder

0

メモリアクティビティを表示するためにJConsoleのようなツールを使用すると、ガーベッジコレクションは一般に重大なアクティビティであることがわかります。他のボトルネックが存在するかどうかを調べるために、プロファイリングをしたいかもしれません。また、ほとんどのガベージコレクションアルゴリズムには、ごくわずかな設定オプションが用意されています。

最後に、私がかなり以前に処理した状況を覚えています。あなたの最小および最大のメモリ設定を互いに近づけておくことは、少なくとも私たちの場合には役に立ちました。それはより頻繁なガベージコレクションを引き起こしたが、彼らは侵入的ではなかった。

これが役に立ちます。

3

あなたが-Xincgcを使用する場合、このsun documentation

同時低停止時間コレクタのとおり:+ UseConcMarkSweepGCをコマンドラインに渡されます。-Xincgc™または-XXがあれば、このコレクタが使用されています。コンカレント・コレクタは、テナント生成を収集するために使用され、アプリケーションの実行と並行してほとんどの収集を行います。 の収集中に短時間アプリケーションが一時停止されます。

スループットコレクタのような他の方法を検討する必要があります。上記のドキュメントには、どのコレクタが有用なのかについての良い説明があります。

+0

このドキュメントを読むと、スループットコレクタは低休止条件にはあまり適していません。すべてのコレクタは時々休止しますが、一時停止がどれだけ長く続くか、実行時間のどれだけが費やされるか一時停止する。 AFAIK、スループットコレクタは個々の休止時間が長くなりますが、最終的には時間がかかりません。インクリメンタルコレクタには、より短い休止時間が設定されます。これにより、停止に費やされる時間がさらに長くなります。 – millimoose

+0

また、リンク先のガイドはJava 5.0用です。デフォルトで利用可能/選択されているガベージコレクタは、HotSpot VMのリリース間で変更されるものです。そのため、最新の関連ドキュメントを使用する必要があります。 – millimoose

3

Java v 1.6はスマートで、どの種類のGCが最適かを判断する必要があります。

私はこれを読んでお勧めします:Garbage collection in Java 6

概要:(両方ではなく)これらのいずれかを試してみてください。

  • -XX:+ UseParallelGC
  • -XX:+ ExplicitGCInvokesConcurren
2

発生している問題は、 '完全なガベージコレクション'(「世界を止めるGC」とも呼ばれます)です。これが発生すると、java appは基本的に動作を停止します。いくつかのポインタのために、このスレッドをチェックしてください:

Tuning garbage collections for low latency

+0

GCログに基づいて、フルコレクションが発生していません。 – Guaranteed

関連する問題