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つのケースをテスト:
我々は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秒]
私たちは多くのメモリを取るいくつかの他のプロガームを開始し、今GCログは次のようになります: 11710。 051:[GC 11710.058:[ParNew:409472K-> 0K(409536K)、5.9080290秒] 489119K-> 81136K(1638336K)、5.9256280秒]これら2例いずれにおいて
、若い世代の時間GCは長くなりますが、マイナーコレクションの休止時間はリアルタイムとほぼ同じです。長時間の休止を引き起こすものはありません。
しかし、他の時間はどこに行くのですか?
ただ、質問、どのようなツールを使用すると、生成に使用しました上記の出力?または、これはオルタナティブな(Oracle以外の)JVMですか?どうもありがとう。 – eckes