it-swarm-es.com

¿Qué causa permgen OutofMemoryError en JBoss?

¿Cuál es la causa subyacente de un OutofMemoryError de permgen en JBoss?

Estoy ejecutando JBoss como 4.2.2 en mi entorno de desarrollo, y esto ocurre después de redistribuir mi aplicación web una gran cantidad de veces.

Blog de Christian Chalt Hansen Da las opciones de JVM que ayudan un lote , pero no resuelvan el problema por completo:

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=128m
8
Peter Hilton

Como ya se mencionó, probablemente esté experimentando cargadores de clase de fugas. Por alguna razón, sus clases no se están descargando. Esto puede suceder por dos razones.

  • Objetos de dichas clases aún existen en el montón, los objetos siempre hacen referencia a su clase, o
  • El cargador de clase se hace referencia en algún lugar, por cualquier motivo, las cargadoras de clase hacen referencia a sus clases para no cargarlas dos veces

No hay una solución de captura para este problema. Una herramienta útil para ayudarlo a encontrar la causa raíz es la herramienta de analizador de memoria Eclipse , que puede aplicar a un volcado de montones de su JVM (puede habilitar los volcados de montones en OOMes con el -xx: + HeapdumpOutofMemoryError opción). Tal vez comience a buscar objetos java.lang.class de su aplicación web para ver por qué se mantienen vivos. Desafortunadamente, permgen normalmente no es parte de un volcado de montones JVM, por lo que solo puede intentar encontrar artefactos correlacionados en el resto del montón (los objetos de clase no se almacenan en permgen si no estoy equivocado, solo el código de byte es, por favor corríjame si estoy equivocado aunque).

Hth.

Editar:
Dave Cheney sugiere en un comentario que Java.lang.Class-Objects son, de hecho, parte de permgen, y no se incluye en un volante de montones de punto de acceso normal. A menos que tenga un JVM que escriba esta información en el volcado de montones, necesitará un enfoque diferente. Aún puede buscar instancias de sus objetos, pero si está fugando clases/cargadores de clase (ambos, desafortunadamente, se impliquen entre sí), parece que debe buscar otros signos (objetos de meta de datos de JBoss, etc.).

5
falstro

La causa subyacente es las referencias a las clases que se han descartado fugas fuera de su clase de clases, evitando que el JVM descargue esas clases de la Perm Gen. Esas banderas que usa pueden hacer que el JVM purga agresivamente las clases que son descargables, pero no resolverá el problema subyacente.

Hay una buena explicación compleja de Abeit aquí

2
Dave Cheney

La causa del error de Permgen OutofMemory es la aplicación Redistry. La causa subyacente se filtran los objetos de clase en permgen de las redistribuciones.

Por supuesto, la solución alternativa es reiniciar el JVM después de un cierto número de redistribuciones.

Este es un problema muy difícil de resolver totalmente, aunque con un montón, a menudo puede hacer grandes mejoras. Aquí es donde empiezas: cuando se detiene su aplicación web, asegúrese de que:

  • todos hilos que empezaste están detenidos
  • Todos Threadpools que empezaste se apagan
  • todas Referencias estáticas que puede liberar se liberan

Estas son algunas de las cosas que pueden causar que un objeto de clase esté atrapado en permgen.

Además, tenga en cuenta que no todos los objetos de clase JVMS (o todas las versiones de JVM) de JVM (o todas las versiones de JVM) en permgen. Si está ejecutando un JVM o una versión de un JVM que no se convertirá en objetos de clase GC en permgen, entonces su única opción es reiniciar el JVM después de un cierto número de redistribuciones. Esto probablemente no se le aplica, dado las opciones de JVM que menciona.

1
Eddie