29

多くの Tomcat サーバーを実行しており、特にメモリ使用量が比較的少ない場合、フル ガベージ コレクション (GC) が 1 時間ごとに実行されることがよくあります。正確な時刻は、アプリケーション サーバーが起動された時刻に関連しているように見えます。サーバーが 01:13 に開始された場合、フル GC は 02:13 に実行され、次のフル GC は 03:13 に発生します。この動作を説明するドキュメントを見つけることができませんでした。

これが問題になるのは、同時に開始されたすべてのサーバー プールがほぼ同時にフル GC を実行する傾向があるためです。GC の遅延が長すぎて、ロード バランサーがサーバーを停止しているとマークした場合、アプリケーション全体が一時的にオフラインになる可能性があります。2 つのサーバーが同時に完全な GC を実行しないように、完全な GC を一定期間にわたって分散できればよいのですが、この動作を制御する方法が見つかりません。

他の誰かがこの動作を見たことがありますか? これらの「通常の」フル GC が発生するタイミングに影響を与える方法はありますか?

4

2 に答える 2

25

「通常の」毎時 GC は、おそらくこの既知のバグによるものです

Tomcat のバージョンとgcDaemonProtectionプロパティの値を確認しますJreMemoryLeakPreventionListener(デフォルトはtrue)。

このパッチは、Tomcat v.7.0.28+ および v.6.0.36+ に含まれていたとされています。

サーバーをアップグレードするか、ここからアップグレード以外のソリューションを選択してください。概要は次のとおりです。

  1. JVM arg を使用してフル ガベージ コレクションを抑制する-XX:+DisableExplicitGC
  2. 完全な GC を保持しますが、JVM 引数を使用して CMS コレクターに従います -XX:+ExplicitGCInvokesConcurrent
  3. 設定<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. リスナーを無効にする

クレジットが必要な場合はクレジット。ここから最初の回答を得ました。

于 2013-02-15T20:42:17.470 に答える
3

間隔を変更できるはずです

-Dsun.rmi.dgc.client.gcInterval=60000
-Dsun.rmi.dgc.server.gcInterval=60000

ここを見て ください https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html

于 2013-02-15T20:48:15.300 に答える