Tomcat的JreMemoryLeakPreventionListener监听周期性频繁执行full gc

昨天下午公司有个后台管理系统,部署后,今天早上观察来看,发现gc.log中频繁的执行full gc,活动轨迹很明确,都是一个小时执行一次整个空间的full gc,但明显内存占用率还远远没有达到阈值,从日志上可以明确判断出应该是执行System.gc后导致的,因此回忆了下,貌似记得Tomcat的server.xml中有一个防止内存溢出的JreMemoryLeakPreventionListener监听,这个监听器每小时就会执行一次full gc操作。

GC日志如下:

2014-12-30T17:58:35.403+0800: 1.346: [GC [PSYoungGen: 11796K->1600K(688128K)] 11796K->1600K(1998848K), 0.0079880 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
2014-12-30T17:58:35.412+0800: 1.354: [Full GC (System) [PSYoungGen: 1600K->0K(688128K)] [ParOldGen: 0K->1533K(1310720K)] 1600K->1533K(1998848K) [PSPermGen: 9890K->9881K(21248K)], 0.1058880 secs] [Times: user=0.10 sys=0.00, real=0.10 secs] 

2014-12-30T18:58:35.523+0800: 3601.466: [GC [PSYoungGen: 448564K->6578K(688128K)] 450097K->8111K(1998848K), 0.0310010 secs] [Times: user=0.03 sys=0.00, real=0.03 secs] 
2014-12-30T18:58:35.555+0800: 3601.497: [Full GC (System) [PSYoungGen: 6578K->0K(688128K)] [ParOldGen: 1533K->7148K(1310720K)] 8111K->7148K(1998848K) [PSPermGen: 27454K->27270K(47040K)], 0.2429830 secs] [Times: user=0.32 sys=0.01, real=0.24 secs] 

2014-12-30T19:58:35.803+0800: 7201.746: [GC [PSYoungGen: 108961K->448K(688128K)] 116109K->7596K(1998848K), 0.0059280 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2014-12-30T19:58:35.809+0800: 7201.752: [Full GC (System) [PSYoungGen: 448K->0K(688128K)] [ParOldGen: 7148K->6779K(1310720K)] 7596K->6779K(1998848K) [PSPermGen: 27298K->27295K(49728K)], 0.1770710 secs] [Times: user=0.27 sys=0.00, real=0.18 secs]  

网上还是有蛮多解决方案,还是说说我最比较喜欢且常用的吧,

1、添加gcDaemonProtection="false"参数禁用JreMemoryLeakPreventionListener监听。

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>

 

2、直接删除JreMemoryLeakPreventionListener监听。

你可能感兴趣的:(listener)