我们的 Tomcat 7 安装存在一些重大问题。它曾经运行良好超过一年,但现在 CPU 主要处于 400% - 700%(8 核机器),在日志中我看到了这些音调:
2015-04-01T23:05:13.046+0200: 5177.229: [GC2015-04-01T23:05:13.046+0200:
5177.229: [ParNew: 1398632K->345K(1747648K), 0.0062240 secs]
3439622K->2041335K(5941952K) icms_dc=0 , 0.0063310 secs] [Times: user=0.04
sys=0.00, real=0.00 secs]
我对 Tomcat 启动的设置(在 setenv.sh 中)是:
CATALINA_OPTS="$CATALINA_OPTS -server -Xms6G -Xmx6G -XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode -XX:NewRatio=2 -XX:SurvivorRatio=4
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
-Djava.awt.headless=true
-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true
-Dmail.mime.decodeparameters=true -Djava.security.egd=file:/dev/./urandom"
通常的行为是这样的,机器运行一个小时左右,我看到它消耗内存,然后它开始尝试 GC,我每秒都会获取这些日志条目。
我尝试过不同的 GC 设置,但都没有成功。由于这是最近才发生的,我想知道这可能是什么原因造成的,或者是否有人有解决方案?
我的服务器有 32GB RAM,装有 Ubuntu LTS 14.04.2 和 Oracle Java 7。
答案1
您已打开 GC 日志记录,并且看起来 GC 运行良好。
[ParNew: 1398632K->345K(1747648K), 0.0062240 secs]
表示在不到 1/100 秒的时间内清理了大约 1.2 GB 的新对象。如果这种情况每秒发生一次,则应用程序正在创建大量短寿命对象。检查时间戳并查看这种情况发生的频率。我通常将新一代 GC 周期间隔设为几秒钟(10 秒或更长时间)。您提供的数据不足以进行大量分析。并发 GC 周期通常每小时左右发生一次。它们具有一组不同的日志消息。
为 GC 数据指定单独的日志文件通常很有帮助。这样更容易查看。您可以指定此日志在达到一定大小后进行轮换。尝试这些选项-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=100M
,如果您没有单独的日志,请添加-Xloggc:logs/gc.log
。
由于新生代如此之大,并发 GC 可能需要很长时间才能运行。添加-XX:+ScavengeBeforeFullGC
将导致新生代在开始时被清理,并应改善 GC 调优。
查看以下文档垃圾收集以便更好地了解正在发生的事情。