TomcatのJreMemory Leak Provention Listenerは1時間に一回のfuを実行します。

1982 ワード

仕事は一時間に一回のフルgc問題に出会います。そして一回8秒運行して、体験に影響します。だから日志を変えてきました。Markさんにお願いします。
プロジェクトはTomcat 7に配置されています。オペレーティングシステムはcentOS 5.5で、gcのログを印刷しています。一部のfull gcはheapがまだ空いている時に実行しています。その後よく見たら、一時間に一回実行することが分かりました。ログは下記の通りです。
2011-12-13 T 19:01:36.706+0800:1.111:[Full GC(System)[PSYoungGen:1936 K->0 K(597312 K)][PSOldGen:0 K->1860 K(1365376 K)]1936 K->1860 K(1962688 K)[PSPermn:1040 K,24266] 
2010-11-12-3 T 20:01:368.16+0800:3601.221:[Full GC(System)[PSYoungGen:33170 K->0K(597312 K)][PSOldGen:1860 K->30610 K->30030 K-30610 K->30610 K-30610 K-30610 K(1962688 K)[PSrmn-GeK][PSrmn-260 K]]30610 K-30610 K]]30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30610 K-30」 
2010-1-12-3 T 21:01:37.2010+0800:7201.06:[Full GC(System)[PSYoungGen:3424 K->0K(597312 K)][PSOldGen:30610 K->33665 K(1365376 K)]34034 K-33665 K>33665 K-33665 K-33665 K(1962688 K)[PSrmm-338383838 K][PSm-333688K][PSm]33666 K][PSP-3366666 K][PSP-3366666 K][PSP-33666 K][PSP-3366666 K][PSP-33666 K][PSP-33666 K][PSP-336666 
 
そしてgoogleは、TomcatのJreMemory Leak Provention Listenerが呼び出したfull gcであることを発見しました。目的はメモリの流出です。コードは以下の通りです。
synchronized(GC.lock){l = GC.latencyTarget;if(l != 9223372036854775807L)break label0;GC.daemon = null;}return;}long l1 = GC.maxObjectInspectionAge();if(l1 >= l){System.gc();l1 = 0L;}
いいです
System.gc()を呼び出したのを見て、この一時間に一回のフルルgcを停止するいくつかの方法があります。
1.jvmパラメータを追加することにより 
-XX:+Dispable ExplicitGC
  明示的な呼び出しを停止するために、ここでは、いくつかの書き込みが必要です。
-XX:-Dispable ExplicitGCは停止full gcであり、
-XX:+Dispable ExplicitGCはフルgcを起動します。全くでたらめです。
2.はい
JreMemoryLeak Provention Listenerにパラメータを追加しました。以下の通りです。
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"gcDaemonProtection="false"/>
このようにするとやはりデーモンプロセスがあります。フルgcを実行しないだけです。
3.このlistenerをtomcatのserver.xmlから取り除く。
私は第2の方法を採用しています。