增加Eden空间堆大小tomcat

增加Eden空间堆大小tomcat,tomcat,garbage-collection,jvm,tomcat8,Tomcat,Garbage Collection,Jvm,Tomcat8,我当前的tomcat配置如下所示 下面提到了我的tomcat配置变量- export CATALINA_OPTS="$CATALINA_OPTS -Xms512m" export CATALINA_OPTS="$CATALINA_OPTS -Xmx12288m" export CATALINA_OPTS="$CATALINA_OPTS -Xmn8192m" export CATALINA_OPTS="$CATALINA_OPTS -XX:NewRatio=1" export CATALINA_O

我当前的tomcat配置如下所示

下面提到了我的tomcat配置变量-

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx12288m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmn8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:NewRatio=1"
export CATALINA_OPTS="$CATALINA_OPTS -XX:SurvivorRatio=4"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark"
export CATALINA_OPTS="$CATALINA_OPTS -Xloggc:/opt/tomcat/logs/gc_$(date +%d-%m-%y-%H-%M).log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps"
上图很好地显示了来自上述配置的分配。年轻一代堆大小约为8GB,老一代堆大小约为4GB。看起来都不错。但是我检查了gc日志,发现当eden空间大约满1GB时会触发垃圾收集

2019-02-27T06:26:48.881+0000: 1027.464: [GC (Allocation Failure) [PSYoungGen: 1247052K->30885K(1296896K)] 1283550K->67399K(1360896K), 0.0245425 secs] [Times: user=0.09 sys=0.03, real
=0.02 secs]
2019-02-27T06:28:08.578+0000: 1107.161: [GC (Allocation Failure) [PSYoungGen: 1183909K->31338K(1438720K)] 1220423K->67860K(1502720K), 0.0354672 secs] [Times: user=0.12 sys=0.03, real
=0.03 secs]
2019-02-27T06:29:32.316+0000: 1190.899: [GC (Allocation Failure) [PSYoungGen: 1378672K->31886K(1312768K)] 1415194K->68416K(1376768K), 0.0237727 secs] [Times: user=0.10 sys=0.00, real
=0.03 secs]
2019-02-27T06:30:17.752+0000: 1236.335: [GC (Allocation Failure) [PSYoungGen: 1312398K->31671K(1286144K)] 1348928K->68209K(1350144K), 0.0240825 secs] [Times: user=0.12 sys=0.01, real
=0.02 secs]
2019-02-27T06:31:01.988+0000: 1280.571: [GC (Allocation Failure) [PSYoungGen: 1248695K->31838K(1188864K)] 1285233K->68385K(1252864K), 0.0288038 secs] [Times: user=0.15 sys=0.00, real
=0.03 secs]
2019-02-27T06:31:44.973+0000: 1323.555: [GC (Allocation Failure) [PSYoungGen: 1188446K->31749K(1166848K)] 1224993K->68295K(1230848K), 0.0231320 secs] [Times: user=0.13 sys=0.00, real
=0.02 secs]
2019-02-27T06:32:26.203+0000: 1364.786: [GC (Allocation Failure) [PSYoungGen: 1131013K->32025K(1077248K)] 1167559K->68579K(1141248K), 0.0351297 secs] [Times: user=0.14 sys=0.00, real
=0.03 secs]
我不明白为什么在执行一个年轻的GC之前,eden空间没有占用全部7GB的空间。从日志中可以看出,gc每2分钟触发一次,每次gc调用都会将系统暂停30毫秒。是否可以充分利用分配的堆空间。

在生产系统上,我的建议是使用相同的-Xms和-Xmx值,因为在启动时,您希望确保允许的最大内存可用。您不希望最后2G内存的分配在周日凌晨3点失败。这与Holger的评论是一致的:您指定不希望JVM分配所有内存,而JVM遵守了这个愿望

另一方面:GC是抽象的,很少有理由关心它的细节。从应用程序的角度来看,您不知道它实际上是什么时候出现的——可能是在低负载时间,每2分钟一次,或者内存几乎已满

对于某些GC算法和应用程序,建议确定应用程序所需的最小内存量,只增加一点开销,并对其进行配置,因为频繁的短GC运行比不频繁的长GC运行要好。如果您正在使用的GC和您的应用程序中仍然存在这种情况,则有待发现

应该根据应用程序的需要而不是碰巧可用的内存来授予应用程序内存

如果您需要12G:继续,用-Xms分配它们。 如果你只是提供12G来解决内存泄漏:修复它。 如果你只是因为服务器上有那么多可用内存而提供12G:找出你的应用程序需要什么,然后分配这个数量加上一些余量
关于开发系统:何必麻烦?

您指定了512M的初始堆大小。这意味着您不希望JVM在可以避免的情况下使用全部空间。