【问题标题】:Optimizing Tomcat / Garbage Collection优化 Tomcat / 垃圾回收
【发布时间】:2019-10-28 20:57:26
【问题描述】:

我们的服务器有 128GB 的​​ RAM 和 64 个内核,在 CentOS 6.3 上运行 Tomcat 7.0.30 和 Oracle jdk1.6.0_38。

每 60 分钟,我们就会发现垃圾收集需要 45 到 60 秒。添加 -XX:-UseConcMarkSweepGC 将页面加载时间增加了大约 10%,但将其降低到大约 3 秒,这是一个可以接受的折衷方案。

我们的配置:

-Xms30g
-Xmx30g
-XX:PermSize=8g
-XX:MaxPermSize=8g
-Xss256k
-XX:-UseConcMarkSweepGC

我们将堆设置为 30 GB 以保持 32 位寻址(我读到 32 GB 以上,64 位寻址占用更多内存,因此您必须达到大约 48 GB 才能看到改进)。

使用 VisualGC,我可以看到 Eden 空间每 30 到 60 分钟循环一次,但 Survivor 0、Survivor 1、Old Gen 和 Perm Gen 发生的情况并不多。

我们有一个强大的服务器。我们还可以做哪些其他优化来进一步减少 3 秒 GC 时间?

对提高性能或扩展有什么建议吗?

任何其他有用的输出或配置信息?

【问题讨论】:

  • -XX:-UseConcMarkSweepGC 默认情况下不是关闭的,也许您打算用-XX:+UseConcMarkSweepGC 打开它,无论如何这对伊甸园大小没有影响。
  • 找到你在哪里创建了这么多对象,看看你可以在哪里使用池和/或缓存来优化它
  • 如果你看到老一代的活动很少,为什么你会得到完整的 GC。我怀疑它是在您不需要它时触发的。
  • @PeterLawrey 没错,这应该是一个 + 号。我进行了切换,页面加载时间增加了 50%。我还没有看到GC需要多长时间。其他改进肯定是我们从 OpenJDK 切换到 Oracle JDK,以及从 36GB 堆到 30GB 堆。
  • 除非您阅读小字体,否则 HotSpot 文档会有点混乱。这些选项不会向您展示如何打开选项,它们会告诉您默认选项是什么。即,如果您按照引用的方式使用它们,它们不应该做任何事情。 ;)

标签: java tomcat optimization garbage-collection performance


【解决方案1】:

这听起来可能违反直觉,但您是否尝试过分配更少的内存?例如。你真的需要一个 30G 的堆吗?万一你能和 4G 甚至更少:垃圾收集可能会更频繁,但当它发生时,它会快很多。通常,我发现这比分配大量内存更可取,因为需要花费大量时间来清理它。

即使这对您没有帮助,因为确实需要 30G 内存,但其他人可能会遇到类似的问题,他们可能会从分配更少的内存中受益。

【讨论】:

  • 特别是,您可以删除“-Xms”标志,并让 JVM 大小达到它喜欢的大小。
  • @pauldoo 如果 -Xmx 是现实的,我建议 -Xmx 与 -Xms 相同:如果您从 2G 开始,但 VM 决定周日晚上凌晨 3 点要分配它来自操作系统的全部允许但失败,尽管正确设置了最大值,您仍将获得 OOM。至少对于生产系统,这是我的默认建议。对于非生产,我同意你的看法。
  • 您为生产系统描述的行为还需要您添加 -XX:+AlwaysPreTouch,否则当 JVM 第一次尝试使用堆。
  • 谢谢,@pauldoo。我一定会看看并将其添加到工具箱中。
【解决方案2】:

看来你需要增量 GC 来减少停顿:

  • -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode

对于没有 visualgc 的跟踪,这对我来说总是很顺利(在 catalina.out 中输出):

  • -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps

2013-01-05T22:52:13.954+0100: 15918369.557: [GC 15918369.557: [DefNew: 65793K->227K(98304K), 0.0031220 秒] 235615K->170050K(491520K), 0.0033220 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

你可以玩这个之后:

  • -XX:NewSize=ABC -XX:MaxNewSize=ABC
  • -XX:SurvivorRatio=ABC
  • -XX:NewRatio=ABC

参考:Virtual Machine Garbage Collection Tuning

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2012-01-28
    • 2013-06-27
    • 2011-11-29
    • 2021-12-20
    • 2011-07-15
    相关资源
    最近更新 更多