优化Tomcat /垃圾收集

时间:2012-12-13 18:15:10

标签: java tomcat optimization garbage-collection performance

我们的服务器拥有128GB内存和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位以上的64位寻址占用更多内存,因此您必须使用大约48 GB才能看到改进)。

使用VisualGC我可以看到Eden空间每30-60分钟就会循环一次,但幸存者0,幸存者1,Old Gen和Perm Gen的情况并不多。

我们有一个功能强大的服务器。我们还可以进行哪些其他优化以进一步缩短3秒的GC时间?

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

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

2 个答案:

答案 0 :(得分:4)

这听起来可能违反直觉,但您是否尝试分配更少的内存?例如。你真的需要一个30G的堆吗?如果您可以与4G相处甚至更少:垃圾收集可能更频繁,但一旦发生它将会更快。通常我发现这比分配大量内存更令人满意,因为它需要花费时间来清理它。

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

答案 1 :(得分:1)

似乎您需要增量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秒] [时间:用户= 0.01 sys = 0.00,实际= 0.00秒]

你可以玩这个:

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

参考:Virtual Machine Garbage Collection Tuning