我在一个tomcat实例上运行了一个Java got应用程序。在高峰时期,webapp每秒提供大约30页,通常在15页左右。
我的环境是:
O/S: SUSE Linux Enterprise Server 10 (x86_64)
RAM: 16GB
server: Tomcat 6.0.20
JVM: Java HotSpot(TM) 64-Bit Server VM 1.6.0_14
JVM options:
CATALINA_OPTS="-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m
-XX:+UseParallelGC
-Djava.awt.headless=true
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
JAVA_OPTS="-server"经过几天的正常运行,整个GC开始更频繁地出现,并成为应用程序可用性的一个严重问题。在tomcat重新启动之后,问题就消失了,但是,当然,在5到10或30天后返回(不一致)。
重新启动前后的完整GC日志位于http://pastebin.com/raw.php?i=4NtkNXmi。
它显示了重新启动之前的日志,在6.6天的正常运行时间,应用程序正在遭受痛苦,因为完整的GC需要2.5秒,并且每6秒发生一次。
然后显示重新启动后的日志,其中完整的GC仅每5-10分钟发生一次。
在出现完整GC时,我使用了两个jmap -dump:format=b,file=dump.hprof PID转储(我不确定在一个完整GC发生时还是在两个GCs之间),并在http://www.eclipse.org/mat/中打开它们,但是在泄密嫌疑人中没有得到任何有用的信息:
"net.sf.ehcache.store.compound.impl.MemoryOnlyStore“的
注意,我从来没有得到一个OutOfMemoryError。
接下来我该去哪儿看看呢?
发布于 2012-10-26 10:53:18
我已经从-Xmx1024m转到了-Xmx2048m,问题就解决了。我现在有100天的正常工作时间。
发布于 2011-10-27 14:06:15
当我们有了这个问题,我们最终找到了它的年轻一代太小。虽然我们给了很多公羊,但年轻一代却没有得到公平的份额。
这意味着小型垃圾收集将更频繁地发生,并导致一些年轻对象被移动到终身代中,这意味着也会有更多的大型垃圾收集。
尝试使用值较低的-XX:NewRatio (例如2或3),看看这是否有帮助。
更多信息可以找到here。
发布于 2011-10-27 14:15:11
除了优化JVM的各种选项之外,我还建议升级到VM的较新版本,因为以后的版本有更好的优化垃圾收集器(也没有尝试新的实验性版本)。
此外,如果(部分)向JVM分配更多ram可能会增加执行GC所需的时间,则在使用整个16 GB内存和增加内存占用之间存在一个折衷点,因此可以尝试加倍所有值,以启动
Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m
问候
马西莫
https://stackoverflow.com/questions/7916723
复制相似问题