2011-04-12 16 views
6

detecto constantemente OOM en PermGen de mi entorno:PermGen fuera de la memoria razona

  1. java 6
  2. jboss-4.2.3
  3. No es un gran aplicación web

I Conozco el problema de String.intern(), pero no tengo suficiente uso valioso de él. El aumento del tamaño de MaxPermGen no tomó fuerza (de 128 Mb a 256 Mb).

¿Qué otras razones podrían invocar a OOM para PermGen? ¿Qué escenario de investigación es el mejor en dicha situación (estrategia, herramientas, etc.)?

Gracias por cualquier ayuda

Respuesta

13

See this note

  • controlador JDBC Poner en común/lib (como dice documentación de Tomcat) y no en WEB-INF/lib
  • No ponga commons-logging en WEB-INF/lib ya que tomcat ya lo inicia

los objetos de nueva clase se colocan en el PermGen y ocupan una cantidad de espacio cada vez mayor. Independientemente de cuán grande sea el espacio PermGen, inevitablemente se completará después de suficientes implementaciones. Lo que debe hacer es tomar medidas para lavar el PermGen para que pueda estabilizar su tamaño. Hay dos indicadores JVM que manejan esta limpieza:

-XX:+CMSPermGenSweepingEnabled 

Esta configuración incluye el PermGen en un plazo de recolección de basura. Por defecto, el espacio PermGen nunca se incluye en la recolección de basura (y por lo tanto crece sin límites).

-XX:+CMSClassUnloadingEnabled 

Esta configuración le dice al barrido de recolección de basura PermGen que tome medidas en los objetos de la clase. Por defecto, los objetos de la clase obtienen una exención, incluso cuando se visita el espacio PermGen durante una colección de garabage.

+3

CMSPermGenSweepingEnabled está obsoleta de JDK6, además + CMSPermGenSweepingEnabled es útil sólo cuando está activado + UseConcMarkSweepGC de lo contrario es inútil –

+0

@ PMDUBIK-INGENIERIE mi héroe, después de 2 horas de buscar sus comentarios sobre '+ UseConcMarkSweepGC' hace que el PermGen barrer realmente funciona. Uno pensaría que con tantas respuestas diciéndole a la gente que usen 'CMSPermGenSweepingEnabled', alguien mencionaría que tiene que agregar otra bandera ... Tomcat puede redistribuirse sin sumar espacio permgen. –

8

Normalmente se produce este error al volver a implementar una aplicación mientras se tiene un classloader leak, porque significa que todas las clases se vuelven a cargar mientras las versiones antiguas permanecen.

hay dos soluciones:

  • reiniciar el servidor de aplicaciones en lugar de volver a desplegar la aplicación - fáciles, pero molestos
  • investigar y reparar la fuga utilizando un generador de perfiles. Desafortunadamente, las fugas del cargador de clases pueden ser muy difíciles de precisar.
Cuestiones relacionadas