我们最近从Tomcat 4迁移了一个大型,高需求的Web应用程序到Tomcat 5.5,并注意到一些特殊的减速行为似乎与JVM暂停有关.为了在Tomcat 4上运行我们的应用程序并支持随着时间推移增加的负载,许多不那么标准的JVM参数按照下面的设置和调整,我希望有Tomcat JVM调优经验的人可以评论任何可能有害的东西到Tomcat 5.5安装.还要注意其中一些可以从以前版本的Java继承(我们在Java 1.6上运行Tomcat 4并且这些参数成功运行了一段时间,但是有些可能已经被引入以帮助Java 1.4上的垃圾收集,这是我们的Tomcat 4安装了很长时间,现在可能弊大于利了.
一些说明:
应用程序内存占用大约1GB,可能稍微超过.
CPU不是问题 - 所有为应用程序提供服务的机器(负载均衡)都是<30%的CPU
机器上的物理内存有很多空间.
-XX:MaxPermSize = 512m是作为5.5升级的一部分添加的唯一参数,并且是对outofmemory permgen空间问题(它已解决)的反应.
在Java 1.6,Solaris OS上运行
-server -Xms1280m -Xmx1280m -XX:MaxPermSize = 512m -XX:ParallelGCThreads = 20 -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:SurvivorRatio = 8 -XX:TargetSurvivorRatio = 75 -XX:MaxTenuringThreshold = 0 -XX:+ AggressiveOpts -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCaches = false -Dsun.net.client.defaultConnectTimeout = 60000 -Dsun.net.client.defaultReadTimeout = 60000
其中一位Java冠军,Kirk Pepperdine的博客:http://kirk.blog-city.com/how_to_cripple_gc_ergonomics.htm.
引用1"GC文档会告诉你设置会产生什么影响,但通常不知道效果会是什么.你在路上走错路的最大线索就是当你明确设置一个值然后给GC提示时另一个线索是,如果你没有合理的理由来调整设置.而且正因为一些所谓的专家说这种设置效果最好的只是噪音,而不是声音而且不是理由."
引用2"正如我在一篇热门博客文章中所述,除非你有充分的理由这样做,否则不要触摸旋钮.如果你必须触摸旋钮,只需使用那些有助于人体工程学而不是那些有助于人体工程学的那些旋转这会降低人体工程学的能力,以满足您的暂停时间和吞吐量目标."
所以,我建议你回到plain
-server -Xms1280m -Xmx1280m -XX:MaxPermSize = 512m -XX:+ UseConcMarkSweepGC -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCaches = false -Dsun.net.client.defaultConnectTimeout = 60000 -Dsun.net.client.defaultReadTimeout = 60000
找出是否能提供更好的性能.如果是,坚持
BTW,-XX:MaxPermSize = 378m有任何问题吗?
Java 1.6具有比1.4更好的人机工程学.您可能希望将其调整为低于1.4
BTW,您是否尝试过Tomcat 6?Tomcat 6在Java 6上运行得比Tomcat 5.5好得多.
PS:我现在已经使用Tomcat一段时间了,并且通常尝试在这里和那里进行一点点调整,让sun的JDK免费统治.