tomcat - 增加 Eden 空间堆大小 tomcat

标签 tomcat garbage-collection jvm tomcat8

我当前的tomcat配置如下图

enter image description here

下面提到了我的 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"

上述配置的分配在上图中得到了很好的体现。 Young Generation HeapSize 约为 8GB,Old Generation Heap size 为 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]

我很困惑为什么 eden space 在执行 Young GC 之前没有占用完整的 7GB 空间。从日志中可以看出,gc 每 2 分钟触发一次,每次 gc 调用都会使系统暂停 30 毫秒。是否可以充分利用分配的堆空间。

最佳答案

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

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

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

应根据应用程序的需要授予应用程序内存,而不是基于碰巧可用的内存。

  • 如果您需要 12G:继续,并使用 -Xms 分配它们。
  • 如果您只提供 12G 来解决内存泄漏:修复它。
  • 如果您只是提供 12G 内存,因为您的服务器上有那么多可用内存:找出您的应用需要什么,并分配那个数量(加上一些余量)

关于开发系统:何必呢?

关于tomcat - 增加 Eden 空间堆大小 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54938203/

相关文章:

java - 如何从堆中删除java对象?

java - JVM跳转指令的偏移量怎么会是32768呢?

linux - 来自 IP 127.0.0.1 的黑客尝试 - 是否存在需要注意的漏洞?

java - maven项目部署后如何获取正确的绝对文件路径

Java servlet,在排队之前收到每个请求后的响应

c# - 我应该把 KeepAlive 放在我的 finally block 中吗?

java - 为什么并发标记和清除 (CMS) 没有清理与 Full GC 相同数量的内存?

java - CAS 服务器 Tomcat 8 Java 8 高可用性(HA/集群)

多次运行后javascript崩溃

java - JVM 安全点暂停,但仅当代码在方法中时才会暂停,并且不是 GC 参与