Problemas de memoria

Uno de los primeros problemas con los que te encuentras al comenzar a desarrollar con ADF sobre tomcat es el odiado “Exception in thread “TP-Processor2″ java.lang.OutOfMemoryError: PermGen space”. Encontre alguien a quien le pasaba lo mismo que a mi en Tomcat – User. La solución la encontré en la página de Sun sobre las opciones de la máquina virutal y pasa por agregar a JAVA_OPTS una opción donde se indique el máximo de memora que usará el servidor en el catalina.sh:

JAVA_OPTS="-XX:+PrintGCDetails -XX:MaxPermSize=500m"


Lo de PrintGCDetails agrega información sobre el estado de la memoria a los logs del tomcat.
Todo esto lo hice (como siempre) sin tener mucha idea de qué significa cada cosa. Ahora he pasado a la fase dos: “Exception in thread “TP-Processor2″ java.lang.OutOfMemoryError: Heap space”. Así que me puse a buscar la mejor manera de optimizar la memoria y encontré un artículo muy interesante donde explica los conceptos de manera secilla y clara. Será más útil para aquellos que gocen del privilegio de tener un OC4J: Java & Memory in an iAS environment. Leyéndolo fue como descubrí que con el MaxPermSize sólo estoy aumentando el máximo de memoria “permanent generation”. Intenté aumentar también el tamaño del Heap con los parámetros -Xms y -Xmx, que entiendo que se refiere al total (joven + vieja + permanente).

-XX:+PrintGCDetails -XX:PermSize=64m -XX:MaxPermSiz
e=500m -Xms256m -Xmx512m -server

El parámetro -server hace que la máquina virtual se comporte de manera optimizada para servidor. Tarda más en arrancar al principio pero se supone que luego va mejor.
Un compañero me pasó la url de la documentación oficial de Sun Tuning the Java Runtime System. Gracias a ella ahora comprendo los mensajes de log del recolector de basura que quedan como consecuencia del parámetro PrintGCDetails. Explica también otro problema que me surgió después. Cuando el recolector se llena al máximo el servidor tiene que vaciarlo. En mi caso tardaba algo más de cinco segundos, lo que provocaba fallos en las aplicaciones. Así que he agregado a la lista de parámetros estos dos:

-XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=1

Se supone que esto cambia el algoritmo de recolección de basurilla haciendo que se limpie más a menudo y con un menor coste de tiempo.
El parámetro SoftRefLRUPolicyMSPerMB indica el ratio de segundos de vida por mega libre en el heap. Al poner el parámetro -server la JVM ajusta este ratio para retardar lo máximo posible la recolección. De ahí que no me hubiera pasado antes. Encontré unas FAQs que explicaban la función de este parámetro en Sun Developer Network. Si he comprendido bien el concepto, un valor de 1000 en este parámetro indica que si mi heap es de 500M y me quedan libres 250M los objetos del recolector tendrán 250 segundos de vida.
El parámetro UseConcMarkSweepGC parece que pone a trabajar u tipo específico de recolector de basura denominado concurrent low pause collector. He encontrado los distintos tipos de recolector descritos en www.javafaq.nu.

Anuncios

7 comentarios en “Problemas de memoria

  1. A mi me pasa lo mismo.El problema es que no se donde encontrar o incluir esas opciones, ya que no encuentro ni tomcat.bat ,ni tomcat.sh,ni catalina.bat, ni catalina.sh…..no se donde agregar esas opciones!! Quien me pueda ayudar se lo agradeceria mucho

  2. no esta alli. Lo busque con el buscador y no lo encontre. Deberia estar en la carpeta de conf pero no esta. Puede ser que este en otro archivo , o si lo tengo que crear, o bien en angun archivo de la memoria virtual de java? Cual?

  3. Debes de agregar esas opciones en la variable de entorno CATALINA_OPTS.

    en windows click boton derecho sobre mi pc, click en opciones avanzadas, click en variables de entorno, y ahi das de alta la variable con sus valores. En el primer cuadro pones CATALINA_OPTS y en el segundo ej.
    -Xms128m -Xmx512m.

    nota: Para ver el valor de tu variable de entorno, habre una linea de comandos y escribe: echo %CATALINA_HOME%

  4. Los parametros los puedes colocar en el profile a si puedes asegurarte de que esten siempre activos

    sudo nano /etc/profile

    colocas lo siguiente

    export JAVA_HOME=/usr/java/jdk1.5.0_15
    export JRE_HOME=${JAVA_HOME}/jre
    export PATH=$PATH:${JAVA_HOME}/bin
    export JAVA_OPTS=”-XX:+PrintGCDetails -XX:PermSize=1024m -XX:MaxPermSize=1024m $

    suerte

Los comentarios están cerrados.