我在一个tomcat实例上运行了一个Java webapp。在高峰时段,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"
经过几天的正常运行后,Full GC开始更频繁地发生,并且它成为应用程序可用性的严重问题。在tomcat重新启动之后,问题就会消失,但当然会在5到10天或30天后返回(不一致)。
重启前后的完整GC日志为 http://pastebin.com/raw.php?i=4NtkNXmi
它显示重启之前的日志,在6.6天的正常运行时间,因为完整的GC需要2.5秒,并且每隔约6秒发生一次。
然后它会在重启后显示一个日志,其中Full GC仅每5-10分钟发生一次。
我有两个转储使用 jmap -dump:format=b,file=dump.hprof PID
当Full GC发生时(我不确定在完全GC发生时或两个完整GC之间是否完全正确)并打开它们 http://www.eclipse.org/mat/ 但在泄漏嫌疑人中没有得到任何有用的东西:
- 60MB:“org.hibernate.impl.SessionFactoryImpl”的1个实例(我使用带有ehcache的hibernate)
- 80MB:1,024个“org.apache.tomcat.util.threads.ThreadWithAttributes”实例(这些可能是tomcat的1024个工作者)
- 45MB:37个“net.sf.ehcache.store.compound.impl.MemoryOnlyStore”实例(这些应该是我在ehcache中的~37个缓存区域)
请注意,我从未得到OutOfMemoryError。
关于我下一步应该去哪看的任何想法?