7

我们的服务器有 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 时间?

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

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

4

2 回答 2

4

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

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

于 2013-01-06T09:52:37.630 回答
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)(98304K),0.0031220 SECS SECS] 235615K-> 1700010.000320.000320 K(490050K) =0.00,实数=0.00 秒]

在你可以玩这个之后:

  • -XX:NewSize=ABC -XX:MaxNewSize=ABC
  • -XX:幸存者比率=ABC
  • -XX:新比率=ABC

参考:虚拟机垃圾收集调优

于 2013-01-05T21:58:55.820 回答