xmn - set java memory
java.lang.OutOfMemoryError: espacio PermGen (8)
Estoy recibiendo un error de seguimiento con frecuencia en eclipse IDE 3.2, ¿cómo podría guardar la aplicación de estos OutOfMemory?
java.lang.OutOfMemoryError: PermGen space
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClassCond(Unknown Source)
java.lang.ClassLoader.defineClass(Unknown Source)
java.security.SecureClassLoader.defineClass(Unknown Source)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1814)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
org.jboss.web.tomcat.service.WebAppClassLoader.findClass(WebAppClassLoader.java:75)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111)
org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325)
com.mfic.util.HibernateUtil.<clinit>(HibernateUtil.java:16)
com.mfic.dao.BaseHome.getSession(BaseHome.java:16)
com.mfic.core.helper.UserManager.findByUserId(UserManager.java:248)
com.mfic.core.action.Login.authenticate(Login.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
Aumenta tu MaxPermSize
en tu eclipse.ini
. Sugiero configurarlo a 128M o 256M si está cómodo con la RAM
-vmargs -XX:PermSize=64M -XX:MaxPermSize=128M
También tenga en cuenta que muchas personas se enfrentaron a problemas de PermGen con Eclipse 3.2 como se informó en Perm-Gen Errors Got You Down? . Y dado que Eclipse 3.2 tiene más de 4 años, le sugiero actualizar a una versión más reciente (Eclipse 3.6 es la versión actual).
Referencias
Esto ocurre con bastante frecuencia al ejecutar Tomcat dentro de Eclipse durante las sesiones de depuración, etc. De memoria, es un problema con Sun JVM. Annnyway, hay una solución fácil:
Simplemente agregue lo siguiente debajo de sus -vmargs en eclipse.ini (que está en el mismo directorio que su eclipse binario):
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
Esto permitirá una recolección de basura más agresiva mientras se ejecuta Eclipse, y es una solución más elegante que solo tirar más RAM en Eclipse.
¡Espero que esto ayude!
Las aplicaciones Java solo pueden usar una cantidad limitada de memoria. La cantidad exacta de memoria que su aplicación particular puede usar se especifica durante el inicio de la aplicación. Para hacer las cosas más complejas, la memoria de Java se separa en diferentes regiones, una de las cuales se llama PermGen.
El tamaño de todas esas regiones se establece durante el lanzamiento de JVM. Si no establece explícitamente los tamaños, se usarán los valores predeterminados específicos de la plataforma.
Entonces, el mensaje de java.lang.OutOfMemoryError: PermGen space
indica que el área de Tamaño permanente en la memoria está agotada .
Esta área específica llamada PemGen es una región dedicada donde se cargan y almacenan las clases de Java. Esto consiste en lo siguiente:
- Nombres de las clases
- Campos de la clase
- Métodos de una clase con el bytecode de los métodos
- Información de grupo constante
- Conjuntos de objetos y matrices de tipo asociadas a una clase
- Optimizaciones del compilador Just In Time
Eso es practicamente todo. Algunas partes más, pero no afecta el consumo real de memoria en más de un porcentaje. Todos estos se asignan en la generación permanente y permanecen en la generación permanente.
Como puede ver, los requisitos de tamaño de generación permanente dependen tanto del número de clases cargadas como del tamaño de dichas declaraciones de clase. Por lo tanto, es fácil ver la causa principal de dicho error: se cargan demasiadas clases o clases demasiado grandes en la generación permanente .
La solución rápida para los síntomas es fácil: si hemos agotado el área de PermGen en el montón, necesitamos aumentar su tamaño. Esta solución es de hecho útil si simplemente no le has dado suficiente espacio a tu JVM. Por lo tanto, modifique la configuración de inicio de la aplicación y agregue (o aumente si está presente) lo siguiente:
-XX:MaxPermSize=512m
Las respuestas anteriores probablemente lo resuelvan por usted, pero aquí hay algunos enlaces relevantes interesantes de todos modos:
Aquí hay un artículo con mucha discusión y sugerencias sobre este error: http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang
Discusión de un ejemplo de cómo puede ocurrir un error OOM de Permgen: http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java
Aquí hay una solución real, publicada recientemente en . Es para Tomcat pero puede ser utilizable en Eclipse: lidiar con el error "java.lang.OutOfMemoryError: PermGen space"
Si obtiene el error cuestionado en la aplicación Eclipse secundaria, agregar -XX:MaxPermSize=512m
en ini
no ayudará. Debes entrar en debug or run configuration->arguments
y agregar esa pieza en los argumentos de VM. También aumenté otros límites de memoria así:
-Dosgi.requiredJavaVersion=1.5 -Xms120m -Xmx2048m -XX:MaxPermSize=1024m
Eso ayudo.
Editar. Después de algunos experimentos que he encontrado, que Eclipse toma límites de memoria del archivo ini. Pero ... lo hace solo una vez, en la creación de un nuevo espacio de trabajo. Los parámetros de -vmarg en eclipse.ini crean la línea de parámetros de VM por defecto. Por lo tanto, si está trabajando en el área de trabajo existente, cambie la configuración de depuración o ejecución. Pero cambie eclipse.ini, también, por un futuro mejor.
Tu proyecto consume mucha memoria. Dale a Eclipse más memoria para trabajar. Edite eclipse.ini
para modificar o agregar las siguientes líneas a continuación -vmargs
.
-Xms256m -Xmx512m -XX:MaxPermSize=512m
Suponiendo que tiene al menos 2 GB de RAM.
Ver también:
Y también después de probar las opciones anteriores, verifique con JVM actualizado. Estaba usando jdk1.6 y enfrenté el mismo problema. Cuando cambié el jvm en eclipse a JDK1.7, funciona bien.
- Haga clic en Instancia de servidor.
- Abrir configuraciones de inicio.
- Aumente la memoria de JVM, en la pestaña argumento.
-Xms64m -Xmx256m
Ver imágenes a continuación: