2011-12-03 7 views
0

JBoss上で動作するWeb Javaベースのアプリケーションは、最大2.2GBの最大ヒープサイズ(Young Generationは400MB、マシンの全物理メモリは4GB) 。ある時点で、アプリケーションは(クライアントに)数分間応答しなくなります。若干の分析の後、我々は、その原因がYoung Generation GCであることを発見した。ここでは詳細GCログからの抜粋です:YGC(ParNew)は、user + sysよりもはるかにリアルタイムです

Heap before GC invocations=3844 (full 7): 
par new generation total 614336K, used 614272K, eden space 614272K, 100% used, from space 64K, 0% used, to space 64K, 0% used , concurrent mark-sweep generation total 921600K, used 690936K, concurrent-mark-sweep perm gen total 262144K, used 65905K 2679114.965: [GC 2681684.725: [ParNew: 614272K->0K(614336K), 0.0132460 secs] 1305208K->692360K(1535936K), 0.0135020 secs] [Times: user=0.03 sys=0.03, real=2569.62 secs] 
Heap after GC invocations=3845 (full 7): 
par new generation total 614336K, used 0K, eden space 614272K, 0% used, from space 64K, to space 64K, 0% used, concurrent mark-sweep generation total 921600K, used 692360K, concurrent-mark-sweep perm gen total 262144K, used 65905K 
Total time for which application threads were stopped: 2569.7748610 seconds 

私は理解していないユーザー+ sysの時間がある一方で、ParNew GCに費やした実際の時間は約42分(2569秒)である可能性、それをどのようにありますわずか0.06秒、マイナーコレクションの休止時間はわずか0.0132460秒です。

私たちは、「仮想メモリのスラッシング」または「高CPU負荷を」推測、この問題を引き起こす可能性があり、そして我々は、2つのケースをテスト:

  1. 我々は100%のCPUを使用するようにwhileループを使用して他のいくつかのprogrameを開始GCログは以下の通りである: 6052.217:[GC 6052.217:[ParNew:409288K-> 0K(409536K)、1.9456320秒]、480161K-> 72140K(1638336K)、1.9460370秒] [times:user = 0.03 sys = 0.00 、実際= 1.95秒]

  2. 私たちは多くのメモリを取るいくつかの他のプロガームを開始し、今GCログは次のようになります: 11710。 051:[GC 11710.058:[ParNew:409472K-> 0K(409536K)、5.9080290秒] 489119K-> 81136K(1638336K)、5.9256280秒]これら2例いずれにおいて

、若い世代の時間GCは長くなりますが、マイナーコレクションの休止時間はリアルタイムとほぼ同じです。長時間の休止を引き起こすものはありません。

しかし、他の時間はどこに行くのですか?

+0

ただ、質問、どのようなツールを使用すると、生成に使用しました上記の出力?または、これはオルタナティブな(Oracle以外の)JVMですか?どうもありがとう。 – eckes

答えて

1

ワールドGCを停止する前に、すべてのスレッドが安全なポイントに到達する必要があります。通常これは非常に迅速に行われますが、いくつかのJNIメソッドはセーフポイントなしで長時間実行されることがあります。これは、GCが実際に開始するまでに長い時間がかかるという理由の1つです。

あなたは再びこれを見る場合は、Cレベルのスタックトレースを取得する価値があるだろう(jstackは、GCが実行された後まで応答しないように思われる)

+0

それが再び現れました。 – lida