perm outofmemoryerror gen error java tomcat permgen

java - outofmemoryerror - tomcat error permgen space



que hacer con el espacio de Tomcat PermGen (6)

ANTECEDENTES : Tengo un proyecto web que usa JSP. El IDE es Eclipse. La configuración de tomcat es: Publicar automáticamente cuando los recursos cambian y el intervalo de publicación es "1 segundo".

Un archivo de propiedades en la carpeta de clases que solía guardar algunas configuraciones. También puede ser modificado dinámicamente por el servlet. La operación de modificación se inicia mediante el botón guardar en el JSP.

PROBLEMA : Después de varias operaciones de guardado, Tomcat viene con java.lang.OutOfMemoryError: PermGen space .

MENSAJE DE REGISTRO

java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58) at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297) at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083) at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560) at java.lang.Thread.run(Thread.java:662)


El servidor Tomcat ejecuta JAVA diferente y el eclipse se ejecuta en diferentes JAVA.

Entonces, agregar -XX:MaxPermSize=512m a eclipse.ini ayudará a resolver este problema. Siga los pasos a continuación para agregar esto al servidor tomcat:

  • Hacer doble clic en el servidor en eclipse

  • abrir configuración de lanzamiento

  • agregue "-XX: MaxPermSize = 512m" a los argumentos de VM en la pestaña Argumentos.


Puede establecer una variable de entorno denominada: " JAVA_OPTS " y establecer el valor de la misma como sigue -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m


Solo para agregar para Windows, si alguien todavía está atorado: -

  1. Abra el archivo catalina.bat (ubicado en la carpeta de instalación de Apache tomcat / bin)
  2. Establezca JAVA_OPTS de la siguiente manera desde el principio (antes de su primer uso en cualquier lugar del archivo):

    establecer JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256m

  3. Reinicie Tomcat y listo.

Puedes encontrar una buena explicación here


Tomcat necesita mucho permgen. 512m no es un máximo irrazonable. Sin embargo, solo retrasa la fuga de implementación en caliente. Permgen crecerá ~ 25mb por hotdeploy, que, en Eclipse, podría ser cada vez que guarde un archivo Java. 512m desaparece rápido si tienes una contracción Ctrl + S como yo.

La solución: permite que Java elimine las definiciones de clases de la memoria, es decir, el código de bytes de recolección de basura. Agregue estos junto con su tamaño de permgen reforzado:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC


estableciendo así:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m


PARA ECLIPSE

  1. Ir a las propiedades del servidor
  2. Ir a la plataforma
  3. Ahora en el argumento VM, escriba esto -Xms256m -Xmx256m -XX: PermSize = 256m -XX: MaxPermSize = 512m

PARA NETBEANS

  1. Ir a la carpeta de Netbeans / etc /
  2. abra netbeans.config en cualquier editor
  3. edita esta línea como

netbeans_default_options = "- J-client -J-Xss256m -J-Xms256m -J-XX: PermSize = 256m -XX: MaxPermSize = 512m -J-Dapple.laf.useScreenMenuBar = true -J-Dapple.awt.graphics.UseQuartz = true -J-Dsun.java2d.noddraw = true -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true "

Eso es todo