【发布时间】: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