1

環境の詳細:OS:Linux RedHat Java:JRE 6 Update 21

アプリに次のGC設定を使用しています。

-server -d64 -Xms8192m -Xmx8192m -javaagent:lib/instrum.jar -XX\:MaxPermSize=256m -XX\:+UseParNewGC -X\:+ParallelRefProcEnabled -XX\:+UseConcMarkSweepGC -XX\:MaxGCPauseMillis=250 -XX\:+CMSIncrementalMode -XX\:+CMSIncrementalPacing -XX\:+CMSParallelRemarkEnabled -verbose\:gc -Xloggc\:/tmp/my-gc.log -XX\:DisableExplicitGC -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails -XX\:+UseCompressedOops

そこに設定すると、アプリケーションの開始時に単一のフルGCがあります

2.946: [Full GC 2.946: [CMS: 0K->7394K(8111744K), 0.1364080 secs] 38550K->7394K(8360960K), [CMS Perm : 21247K->21216K(21248K)], 0.1365530 secs] [Times: user=0.10 sys=0.04, real=0.14 secs] 

その後、4〜5回成功したCMSコレクションが続きますが、この後、ログにCMSの痕跡はなく、マイナーコレクションのみにエントリがあります。

379022.293: [GC 379022.293: [ParNew: 228000K->4959K(249216K), 0.0152000 secs] 7067945K->6845720K(8360960K) icms_dc=0 , 0.0153940 secs]

ヒープは継続的に成長しており、7GBに達しています。OOMや本番システムの故障は許されないため、アプリケーションを再起動する必要があります。

CMSコレクターがクリーニングを停止した理由がわかりません。手がかり/提案は大歓迎です。前もって感謝します。

================================================== ====================================1月23日更新。

これまでのご回答ありがとうございました。テスト環境でアプリケーションをセットアップし、次の一連のJVMオプションを使用してアプリをテストしました。

オプション1

-server -d64 -Xms8192m -Xmx8192m -javaagent\:instrum.jar -XX\:MaxPermSize\=256m -XX\:+UseParNewGC -XX\:+UseConcMarkSweepGC -verbose\:gc -Xloggc\:my-gc.log -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails

オプション#2

-server -d64 -Xms8192m -Xmx8192m -javaagent\:instrum.jar -XX\:MaxPermSize\=256m -XX\:+UseParNewGC -XX\:+UseConcMarkSweepGC -verbose\:gc -Xloggc\:my-gc.log -XX\:+DisableExplicitGC -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails

両方の設定で2日間並行してテストを実行しました。これらは私の観察です:

オプション#1ヒープメモリは安定していますが、90個のConcurrentMarkSweepコレクションがあり、JVMは24分を費やしました。それは高すぎます。そして、GCログに次の行が表示され、パターンは1時間ごとに続きます...

318995.941: [GC 318995.941: [ParNew: 230230K->8627K(249216K), 0.0107540 secs] 5687617K->5466913K(8360960K), 0.0109030 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
319050.363: [GC 319050.363: [ParNew: 230195K->9076K(249216K), 0.0118420 secs] 5688481K->5468316K(8360960K), 0.0120470 secs] [Times: user=0.12 sys=0.01, real=0.01 secs]
319134.118: [GC 319134.118: [ParNew: 230644K->8503K(249216K), 0.0105910 secs] 5689884K->5468704K(8360960K), 0.0107430 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
319159.250: [Full GC (System) 319159.250: [CMS: 5460200K->5412132K(8111744K), 19.1981050 secs] 5497326K->5412132K(8360960K), [CMS Perm : 72243K->72239K(120136K)], 19.1983210 secs] [Times: user=19.14 sys=0.06, real=19.19 secs]

マークアンドスイープログが同時に表示されません。これは、CMSがスループットコレクターに切り替えられたことを意味しますか?もしそうなら、なぜですか?

オプション#2:

フルGC(システム)ログが表示されるので、-XX \:+DisableExplicitGCを追加することを考えました。ただし、そのオプションを使用すると、収集は行われず、現在のヒープサイズは7.5Gです。私が疑問に思っているのは、CMSが同時収集ではなくフルGCを実行している理由です。

4

4 に答える 4

1

CMS が実行されています :P

CMS でインクリメンタル モードを使用しています (ただし、実際にはスループットが低下する可能性があるため、気にする必要はありません)。

投稿されたログ行のicms_dcは無料です。これをJVMに記録する唯一のものは... CMSコレクターです。そのGC実行のために、アプリケーションと織り交ぜられた少量のテニュアクリーンアップを行ったと言っています。

ログのこの部分は、新しい並列処理に関連しています (そこにはヒープ サイズがあります)。

379022.293: [GC 379022.293: [ParNew: 228000K->4959K(249216K), 0.0152000 秒]

この部分は増分 CMS (iCMS) です。

7067945K->6845720K(8360960K) icms_dc=0、0.0153940 秒]

なぜ iCMS を使用しているのか、多くの Soft/Weak/Phantom 参照があるのか​​ (または ParallelRefProcEnabled フラグを使用しているのか)、実際にメモリ不足や耐え難い一時停止が発生したことはありますか。

CompressedOops、ParNewGC、および CMS に戻って、他に特別なことを何もせずに試してみて、それがうまくいくかどうかを確認してください。

于 2012-01-13T04:23:52.847 に答える
0

最大サイズを設定すると、その量の仮想メモリがすぐに割り当てられます。

最小サイズを設定すると、すでに最大サイズが割り当てられています。最小サイズが行うことは、この最大値に達するまでメモリを解放するための最小限の手順を実行することだけです。これにより、最大 8 GB を自由に使用するように指示したため、フル GC の数が減る可能性があります。

多くのオプションがオンになっています (一部はデフォルトです)。多くのオプションをオンにすると奇妙な相互作用が発生する可能性があるため、最小限のセットに戻すことをお勧めします。

私は(あなたがSolarisを持っていると仮定して)から始めます

-mx8g -javaagent:lib/instrum.jar -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -verbose\:gc -Xloggc\:/tmp/my-gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

オプション-serverは、サーバー クラス マシン-XX:+UseCompressedOopsのデフォルトであり、最近のバージョンの Java のデフォルトであり、-XX:MaxGCPauseMillis=250単なるヒントです。

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

于 2012-01-10T08:15:29.707 に答える
0

初期ヒープ サイズ -Xms は :8192m で、最大ヒープ サイズは -Xmx8192m であることがわかります。これが、GC がまだスイープの開始を待っている理由の 1 つかもしれません。ヒープサイズを減らしてから、GC が起動するかどうかを確認することをお勧めします。

于 2012-01-10T04:07:34.797 に答える