У меня запущено веб-приложение на Java на одном экземпляре tomcat. В часы пик веб-приложение обслуживает около 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 начинает появляться чаще, и это становится серьезной проблемой для доступности приложения. После перезагрузки кота проблема исчезает, но, конечно, возвращается через 5–10 или 30 дней (не соответствует).
Полный журнал GC до и после перезапуска находится в http://pastebin.com/raw.php?i=4NtkNXmi
Показывает журнал перед перезапуском при времени безотказной работы 6,6 дней, когда приложение страдало, потому что Full GC требовалось 2,5 секунды и происходило каждые ~ 6 секунд.
Затем он показывает журнал сразу после перезапуска, где Full GC происходил только каждые 5-10 минут.
У меня есть два дампа, использующих jmap -dump:format=b,file=dump.hprof PID
, когда встречаются полные сборщики мусора (я не уверен, правильно ли я их получил, когда происходил сборщик Full GC, или между 2 полными сборками мусора) и открыл их в http://www.eclipse.org/mat/, но не получил ничего полезного в Leak Suspect:
- 60 МБ: 1 экземпляр «org.hibernate.impl.SessionFactoryImpl» (я использую hibernate с ehcache)
- 80 МБ: 1024 экземпляра "org.apache.tomcat.util.threads.ThreadWithAttributes" (это, вероятно, 1024 рабочих tomcat)
- 45 МБ: 37 экземпляров "net.sf.ehcache.store.compound.impl.MemoryOnlyStore" (это должны быть мои ~ 37 областей кэша в ehcache)
Обратите внимание, что я никогда не получаю OutOfMemoryError.
Есть идеи, где мне искать дальше?