Obtención de problemas de espacio de almacenamiento dinámico de Java en Tomcat 7

Estoy trabajando en una aplicación web Java EE, que consta de Struts, Spring e Hibernate. En eso, obtengo las siguientes excepciones repetidamente (al menos una vez al día).

Excepción 1:

Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
    at java.util.LinkedHashMap.createEntry(LinkedHashMap.java:424)
    at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406)
    at java.util.HashMap.put(HashMap.java:385)
    at sun.util.resources.OpenListResourceBundle.loadLookup(OpenListResourceBundle.java:118)
    at sun.util.resources.OpenListResourceBundle.loadLookupTablesIfNecessary(OpenListResourceBundle.java:97)
    at sun.util.resources.OpenListResourceBundle.handleGetObject(OpenListResourceBundle.java:58)
    at sun.util.resources.TimeZoneNamesBundle.handleGetObject(TimeZoneNamesBundle.java:59)
    at java.util.ResourceBundle.getObject(ResourceBundle.java:368)
    at java.util.ResourceBundle.getObject(ResourceBundle.java:371)
    at java.util.ResourceBundle.getStringArray(ResourceBundle.java:351)
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(TimeZoneNameUtility.java:100)
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(TimeZoneNameUtility.java:81)
    at java.util.TimeZone.getDisplayNames(TimeZone.java:399)
    at java.util.TimeZone.getDisplayName(TimeZone.java:350)
    at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1110)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:899)
    at java.text.SimpleDateFormat.format(SimpleDateFormat.java:869)
    at java.text.DateFormat.format(DateFormat.java:316)
    at org.apache.log4j.helpers.PatternParser$DatePatternConverter.convert(PatternParser.java:443)
    at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)
    at org.apache.log4j.PatternLayout.format(PatternLayout.java:506)
    at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310)
    at org.apache.log4j.DailyRollingFileAppender.subAppend(DailyRollingFileAppender.java:369)
    at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
    at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
    at org.apache.log4j.Category.callAppenders(Category.java:206)
    at org.apache.log4j.Category.forcedLog(Category.java:391)
    at org.apache.log4j.Category.log(Category.java:856)
    at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.log(Log4jMLog.java:161)
    at com.mchange.v2.log.log4j.Log4jMLog$Log4jMLogger.warning(Log4jMLog.java:221)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector.run(ThreadPoolAsynchronousRunner.java:624)

Excepción 2:

Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.HashMap.addEntry(HashMap.java:753)
    at java.util.HashMap.put(HashMap.java:385)
    at java.util.HashSet.add(HashSet.java:200)
    at com.mchange.v2.c3p0.util.ConnectionEventSupport.addConnectionEventListener(ConnectionEventSupport.java:39)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.addConnectionEventListener(NewPooledConnection.java:237)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:292)
    at com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1606)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@6c8bb765" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@6c8bb765" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@6c8bb765" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread ""http-bio-8080"-exec-2" java.lang.OutOfMemoryError: Java heap space
Exception in thread ""http-bio-8443"-Acceptor-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread ""http-bio-8080"-exec-3" java.lang.OutOfMemoryError: Java heap space
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4" java.lang.OutOfMemoryError: GC overhead limit exceeded

Y esta es mi configuración:

-server -Xms2048m -Xmx2048m
-XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:PermSize=512m
-XX:MaxPermSize=1024m -XX:+DisableExplicitGC"

¿Alguien puede señalar que estoy recibiendo estas excepciones debido a estas configuraciones o cualquier otra cosa?

Sé que hay algún problema en mi código, pero ¿cómo puedo predecir para encontrar esos problemas? Probé Eclipse MAT para analizar los volcados de memoria, pero no tuve ni idea.

Ya intenté aumentar la memoria para esto, pero no ayudó mucho, excepto solo reducir la frecuencia de estas excepciones.

Por favor ayuda. Gracias por adelantado.

preguntado el 04 de julio de 12 a las 06:07

1 Respuestas

Hay dos opciones sobre por qué está recibiendo estas excepciones. Primero, es posible que su aplicación simplemente necesite esta cantidad de memoria. En segundo lugar, su aplicación pierde memoria. En cualquier caso, MAT es una buena herramienta para diagnosticar el problema. Un buen punto de partida son el árbol de dominadores y el informe de sospecha de fuga.

Respondido 04 Jul 12, 06:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.