我遇到tomcat 7 full gc频繁的问题

8 篇文章 0 订阅
1 篇文章 0 订阅

    近日开始关注JVM的问题,先用jstat -gcutil pid随意看了一套web系统的JVM情况(容器是tomcat 7,jdk是1.7),结果非常惊讶,Full GC频繁,且周期性出现。

 

    问题出现了,好兴奋啊,搞定它我就能增长经验了哇!!于是乎,和我们亲爱的SA同事交流了一番,我用nohup jstat -gccause pid 1s >> ~/xxx/xxx.log &先把gccause日志记录下来,经过半天日志记录追踪之后,发现LGCC是System.gc()。很好奇怎么会出现这东西,我写的代码肯定没有System.gc(),有点怀疑是tomcat的问题(当时也只是怀疑,无任何根据的)。为了解决这个问题,我先尝试在JVM启动参数中加入-XX:+DisableExplicitGC来禁止System.gc(),大半天后再用jstat看gc情况,FGC的次数是0,然后问题解决了。

 

    虽然问题临时解决了,为了知其然知其所以然,我继续深究了一番,最终找到了问题所在:是tomcat 7的一个默认配置(JreMemoryLeakPreventionListener)所导致的,更合适的解决方法似乎是 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>。

 

    以下是引用的内容,原文网址在:http://mail-archives.apache.org/mod_mbox/tomcat-users/201008.mbox/%3CAANLkTino=BjP5LsBCwncB2HvNDzyKLr5y-8yWdt15a89@mail.gmail.com%3E

 

Thank you Konstantin and Chris for your attention.

As stated in the initial post:
'We have recently deployed tomcat-6.0.28 in our organization and are
noticing every hour, a Full GC is occurring.  The same application,
same JVM, same JVM args, just a new tomcat release.'

Using the default JreMemoryLeakPreventionListener configuration that
has 'gcDaemonProtection=true'  will result in 1hr FullGCs using Sun
1.6 b18, b20 and b21on Solaris and Windows. We've tested and
successfully 'contained' the FullGC behavior using one of the below
configurations:

1) suppress the FullGC using JVM arg -XX:+DisableExplicitGC

2) keep the FullGC but to defer to the CMS collector using JVM arg
-XX:+ExplicitGCInvokesConcurrent

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

4) Disable the listener altogether


We've decided to go with option 3.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
G1GC是一种垃圾回收器,它是Java虚拟机中的一部分,用于管理内存中的垃圾对象。G1GC的全称是Garbage-First,它采用了一种独特的垃圾回收策略,可以在多线程同时工作的情况下进行垃圾回收,并且可以与应用程序交替执行,不会完全阻塞应用程序。 G1GC的主要特点包括: - 分代回收:G1GC将堆内存划分为多个区域,每个区域称为一个分代。它会根据垃圾对象的分布情况,优先回收垃圾最多的分代。 - 并发回收:G1GC可以在应用程序运行的同时进行垃圾回收,减少了停顿时间。 - 区域化回收:G1GC将堆内存划分为多个区域,每个区域都可以独立进行垃圾回收,提高了回收效率。 - 可预测的停顿时间:G1GC通过控制每次垃圾回收的时间,可以实现可预测的停顿时间,避免了长时间的停顿对应用程序性能的影响。 要在Tomcat中启用G1GC,可以按照以下步骤进行配置: 1. 打开Tomcat的启动脚本文件(如catalina.sh或catalina.bat)。 2. 在JAVA_OPTS环境变量中添加以下参数: ``` -XX:+UseG1GC -XX:MaxGCPauseMillis=<最大停顿时间> -XX:G1HeapRegionSize=<堆区域大小> ``` 其中,`<最大停顿时间>`是期望的最大停顿时间(以毫秒为单位),`<堆区域大小>`是每个堆区域的大小(以字节为单位)。 3. 保存并关闭启动脚本文件。 4. 重新启动Tomcat。 请注意,G1GC的配置参数可以根据具体的应用程序需求进行调整。建议根据实际情况进行性能测试和调优。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值