Pregunta

A menudo, encontré OutOfMemoryException en IBM Websphere Application Server. Creo que esta excepción ocurre porque mi aplicación recupera enormes datos de la base de datos. Por lo tanto, limito todas las consultas, no recupere datos de más de 1000 registros y establezca JVM de WAS follow

+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent  
                    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000 
                          -Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc  
                          -Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)

Y encontré los archivos heapdump , javacore y snap en la carpeta de perfiles. Creo que me pueden informar sobre la causa del problema, pero no lo hago. No sé cómo leer / usar heapdump, javacore y archivos snap.

Por favor, dígame cómo prevenir / evitar / corregir OutOfMemoryException. Gracias

¿Fue útil?

Solución

La respuesta a esto depende del mensaje asociado con la excepción OutOfMemoryException. También puedes probar -XX: MaxPermSize = ... y configurarlo en algo más grande, como 256m.

Además, si tiene una función recursiva en algún lugar, puede estar causando un desbordamiento de pila.

Si puede, publique el mensaje asociado con la excepción. Stacktrace también podría ayudar.

Otros consejos

Si desea ver los archivos de volcado del montón, IBM ofrece herramientas para analizarlos aquí .

" Gracias por la memoria " es un buen artículo sobre el uso de JVM de la memoria, que podría ayudar a analizar este problema ...

Gracias a bwalliser por este enlace

Intente reproducir el problema localmente para poder utilizar una herramienta como JProfiler para depurarlo. Incluso si no puede forzar un OOM localmente, es probable que vea un aumento de memoria en JProfiler. Luego toma instantáneas y busca clases que no se están recolectando basura. No es una ciencia exacta, pero es mucho más fácil que mirar a través de un montón de IBM. Sin embargo, si tiene que hacerlo, la antigua forma de examinar un volcado de montón era con HeapRoots. Puede depender de la versión en la que se encuentre. Sé que algunas versiones de IBM JDK tienen problemas con la compactación, por lo que incluso si tiene mucha memoria, puede obtener un OOM porque no hay un fragmento lo suficientemente grande disponible.

¿Asumo que estás usando hibernate / JPA como proveedor de persistencia? ¿Estás usando un caché de segundo nivel? Si es así, ¿ha considerado desalojar grandes conjuntos de resultados del caché?

La pregunta es difícil de responder si no sabemos qué tipo de OutOfMemoryError es; permgen y heapspace son dos bestias muy diferentes.

Estuve persiguiendo una generación permanente durante muchos meses en JBoss, aunque ese tipo particular de problema era general para cualquier servidor de aplicaciones que recargaba aplicaciones web sobre la marcha. La saga está documentada aquí .

Esos almacenes de basura que tiene ... podría ser que los pueda analizar en Eclipse MAT .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top