Tomcat的JreMemoryLeakPreventionListener1小時執行一次fu...

工做遇到每小時一次的full gc問題,而且一次運行8秒,影響體驗。故轉來一篇日誌,Mark一下 apache

項目部署在Tomcat7上,操做系統是centOS5.5,打印出gc的日誌,發現有些full gc在heap還很空餘的時候執行,後來仔細一看,發現一小時執行一次,日誌以下: tomcat

2011-12-13T19:01:36.706+0800: 1.111: [Full GC (System) [PSYoungGen: 1936K->0K(597312K)] [PSOldGen: 0K->1860K(1365376K)] 1936K->1860K(1962688K) [PSPermGen: 10426K->10426K(21248K)], 0.0461030 secs] [Times: user=0.06 sys=0.00, real=0.04 secs]  jvm

2011-12-13T20:01:36.816+0800: 3601.221: [Full GC (System) [PSYoungGen: 33170K->0K(597312K)] [PSOldGen: 1860K->30610K(1365376K)] 35030K->30610K(1962688K) [PSPermGen: 52266K->52266K(52352K)], 0.3710140 secs] [Times: user=0.37 sys=0.01, real=0.37 secs]  google

2011-12-13T21:01:37.201+0800: 7201.606: [Full GC (System) [PSYoungGen: 3424K->0K(597312K)] [PSOldGen: 30610K->33665K(1365376K)] 34034K->33665K(1962688K) [PSPermGen: 52400K->52400K(83968K)], 0.3356130 secs] [Times: user=0.34 sys=0.00, real=0.33 secs]  spa

 

而後google,發現是Tomcat的JreMemoryLeakPreventionListener調用的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(),有如下幾種辦法能夠中止這個一小時一次的full gc:
1.經過添加jvm參數  -XX:+DisableExplicitGC   來制止顯式調用的full gc,這裏須要說一點:有些帖子說 -XX:-DisableExplicitGC是中止full gc, -XX:+DisableExplicitGC是啓動full gc,純屬扯淡。
2.給 JreMemoryLeakPreventionListener添加一個參數,以下
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"gcDaemonProtection="false"/>
這樣的話仍是會有守護進程,只是不執行full gc了。
3.把這個listener從tomcat的server.xml裏去掉。

我採用的是第2中 方法
相關文章
相關標籤/搜索