我们的服务器拥有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时间?
有关提高性能或扩展的建议吗?
有帮助的任何其他输出或配置信息?
答案 0 :(得分:4)
这听起来可能违反直觉,但您是否尝试分配更少的内存?例如。你真的需要一个30G的堆吗?如果您可以与4G相处甚至更少:垃圾收集可能更频繁,但一旦发生它将会更快。通常我发现这比分配大量内存更令人满意,因为它需要花费时间来清理它。
即使这对你没有帮助,因为你确实需要30G的内存,其他人可能会遇到类似的问题,他们可能会从分配更少的内容中受益。
答案 1 :(得分:1)
似乎您需要增量GC来减少暂停:
对于没有visualgc的跟踪,这对我来说总是很顺利(在catalina.out输出):
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秒]
你可以玩这个: