我们最近从Tomcat 4向Tomcat 5.5迁移了一个大的、高需求的web应用程序,并注意到了一些与JVM暂停有关的特殊的减速行为。为了在Tomcat 4上运行我们的应用程序并支持随着时间的推移而增加的负载,按照下面的步骤设置和调优了许多不太标准的JVM参数,我希望有Tomcat JVM调优经验的人能够评论任何可能对Tomcat 5.5安装有害的东西。还要注意的是,其中一些可能是继承以前版本的Java (我们在Java1.6上成功地运行了Tomcat 4,使用这些参数成功地运行了一段时间,但有些参数可能是为了帮助Java 1.4上的垃圾收集,Java 1.4是我们Tomcat 4长期安装的基础,现在可能弊大于利)。
一些注意事项:
machines.
)作出了反应。
-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
发布于 2008-10-14 20:14:03
Java冠军之一,Kirk的博客:http://kirk.blog-city.com/how_to_cripple_gc_ergonomics.htm。
引用1:"GC文档会告诉你设置会产生什么影响,但通常不知道会产生什么效果。当你显式地设置一个值,然后给GC人类工效学一个提示时,才是你走错岔路口的最大线索。另一个线索是,如果你没有合理的理由来调整设置,那么仅仅是因为一些所谓的专家说这个设置最好不过是噪音,而不是声音,而且完全不是原因。“
引用2:“正如我在博客上说过的,除非你有很好的理由,否则不要碰旋钮。如果你必须触摸旋钮,只使用那些帮助人体工程学的旋钮,而不使用那些削弱人体工程学能力的旋钮来满足你的暂停时间和吞吐量目标。”
所以,我建议你回到平原
-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
看看这是否能给你更好的表现。如果是,就坚持下去
顺便问一下,-XX:MaxPermSize=378m有什么问题吗?
Java1.6比1.4具有更好的人机工程学。你可能想把它调到1.4以下
顺便问一下,你试过Tomcat 6了吗?Tomcat 6比Tomcat 5.5在Java 6上运行得更好。
P.S :我使用Tomcat已经有一段时间了,并且通常尝试让sun的JDK自由运行,几乎没有任何调整。
发布于 2008-10-14 19:54:06
作为一个也在处理这件事的人,我当然没有任何明确的答案,特别是考虑到应用程序的特殊性,这类事情是怎样的。一个很好的参考,你可能已经看到,在这里:
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
但是,这是一个相当长的jvm参数列表,这表明可能存在不必要的参数集,特别是考虑到您有几个调试选项(PrintGCDetails、PrintGCTimeStamps、TraceClassUnloading),这些选项在生产应用程序上不太好。第二次超时也可能会消耗资源。"server“是默认的,但不会造成任何损害。
应用程序如何使用最小的调优参数(jvm大小,MaxPermSize)运行?
发布于 2008-10-15 13:47:00
您可能还想看看如何更改Tomcat用于处理conf/server.xml中请求的最小/最大线程数。
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" ...我在以前的工作中听到的一个经验法则是,maxThreads应该等于您希望处理的同时连接的数量。我不知道这个说法有多科学,尽管我认为这是有意义的,因为您不希望客户端被阻塞,等待线程释放来处理他们的请求。
https://stackoverflow.com/questions/202502
复制相似问题