Tenemos una aplicación web que se ejecuta Java 6, Tomcat 6, Primavera marco 3, 4 Hibernate, Ehcache. Tenemos un problema con los tiempos de recolección de basura extremadamente largos que pueden tomar 30 segundos o más, dejando la aplicación sin responder.extremadamente largos tiempos de recolección de basura
que estamos actualmente en pruebas, pero aparte de lo obvio: añadir más memoria, me preguntaba si hay aspectos que podríamos sintonizar a reducir el tiempo de recolección de basura.
el principal contribuyente al uso de la memoria es EHCache ya que estamos almacenamiento en caché de forma agresiva. Pero siempre me resulta difícil dimensionar las tiendas EHCache (las nuevas tiendas de tamaño de bytes EhCache, provocan todo tipo de problemas con nosotros porque los gráficos de objetos en caché pueden ser bastante grandes).
Estos son mis ajustes para la JVM
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC
se obtienen estos largos tiempos de memoria antes de llegar al máximo de 704MB? La JVM puede ser un poco "agresiva" al tratar de reducir la memoria utilizada (y posiblemente reubicarla) antes de decidir aumentar la memoria utilizada. ¿Se comporta de la misma manera si usas -Xms704m -Xmx704m en marcha? –
Usando "jstat -gc 1s pid" puede ver si el uso de memoria llega a los viveros o si la asignación de memoria entre guarderías, eden y anterior debe cambiarse. –
A falta de perfilar su aplicación con JProdilfer/Yourkit, no tendrá ninguna sugerencia sólida. –