Tomcat的JreMemoryLeakPreventionListener1小时执行一次fu...

工作遇到每小时一次的full gc问题,并且一次运行8秒,影响体验。故转来一篇日志,Mark一下

项目部署在Tomcat7上,操作系统是centOS5.5,打印出gc的日志,发现有些full gc在heap还很空余的时候执行,后来仔细一看,发现一小时执行一次,日志如下:

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] 

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] 

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] 

 

然后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中 方法

转载于:https://my.oschina.net/imaginegc/blog/150527

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值