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: -
- Abra el archivo catalina.bat (ubicado en la carpeta de instalación de Apache tomcat / bin)
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
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
- Ir a las propiedades del servidor
- Ir a la plataforma
- Ahora en el argumento VM, escriba esto -Xms256m -Xmx256m -XX: PermSize = 256m -XX: MaxPermSize = 512m
PARA NETBEANS
- Ir a la carpeta de Netbeans / etc /
- abra netbeans.config en cualquier editor
- 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