Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

miércoles, 7 de diciembre de 2011

Depurar fugas de memoria en Java (Tomcat)

Depurar fugas de memoria en Java (Tomcat)
Hola a todos. Por fin logro sacar algo de tiempo para escribir el primer post de este año. Esta vez está relacionado con la depuración de bugs relacionado con la memoria.

Si tienes problemas de memoria con Tomcat, o en general con aplicaciones Java(OutOfMemoryException), necesitas o simplemente tienes curiosidad de saber la distribución de la memoria de tu aplicación, no sigas buscando, este es tu post.

Las opciones que voy a mostrar son opciones de configuración de la Máquina Virtual Java (JVM), por lo tanto son aplicables tanto a una simple clase con un método main, como a una aplicación sobre Tomcat o cualquier otro servidor de aplicaciones. Sin embargo, en este post voy a tomar como ejemplo Tomcat, ya que es lo que uso en el desarrollo de aplicaciones web.

Más concretamente utilicé estas opciones para investigar un problema que teníamos con Tomcat. Cada cierto intervalo regular de tiempo, el Tomcat se caía debido a un error de OutOfMemory. Por más que aumentamos la memoria, seguía cayéndose aunque a intervalos más grandes, por lo que empezamos a sospechar que había algo en nuestra aplicación que iba consumiendo memoria y no la liberaba. Nuestra aplicación tenía fugas de memoria.

Para resolverlo necesitabamos saber dónde estaba el problema, y al igual que ocurre cuando te rompes un hueso, el mejor diagnóstico se hace si tienes una radiografía de la memoria. Por suerte Java nos permite hacer esto. Para ello sólo hay que usar el comando jmap.

Antes de continuar comentar que todo lo que expongo aquí es para Java 6. Con Java 5 también lo podéis hacer a partir de cierta versión, pero el formato de los comandos cambia un poco. De todas formas, mi recomendación es que paséis a Java 6. El paso es casi inmediato y os ahorraréis muchos quebraderos de cabeza con estos comandos y opciones.

Para hacer un volcado de la memoria del Tomcat, tendréis que ejecutar lo siguiente:

bash$ jmap -dump:file=heap.hprof

donde es el id del proceso Tomcat. Podéis sacarlo con el comando ps:

bash$ ps -ef | grep tomcat
usuario 13832 1 79 22:37 pts/0 00:00:14 /usr/lib/jvm/java-6-sun/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.endorsed.dirs=/opt/tomcat/common/endorsed -classpath :/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/commons-logging-api.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start

En mi caso el pid sería 13832 y por tanto la ejecución del comando jmap quedaría así:

bash$ jmap -dump:file=heap.hprof 13832
Dumping heap to /opt/apache-tomcat-5.5.25/heap.hprof ...
Heap dump file created

Esto genera el fichero heap.hprof en el directorio donde ejecutéis el jmap. Este fichero es un volcado de lo que hay en la memoria del Tomcat, y por tanto ocupará tanto como la memoria del Tomcat. Comprobad que tenéis espacio en disco suficiente para generarlo.

Sin embargo, no necesitábamos una radiografía de la memoria en cualquier momento, la necesitábamos justo en el momento en que el hueso se rompía, es decir, cuando el Tomcat lanza la OutOfMemoryException. Por suerte, contamos con las opciones de la JVM. Para que Tomcat -y repito: Tomcat o cualquier aplicación Java- genere un volcado de la memoria al producir una OutOfMemoryException tenéis que poner entre sus JAVA_OPTS las siguientes opciones:

-XX:HeapDumpPath=/ruta/donde/guardar/el/fichero/ -XX:+HeapDumpOnOutOfMemoryError

Observad que es un más(+) lo que hay antes de HeapDumpOn..... Si ponéis un menos(-), no os funcionará. Es un error muy típico ;-)

En el caso del Tomcat, tendremos que editar el fichero catalina.sh y meter las opciones en la variable CATALINA_OPTS. Por ejemplo:

CATALINA_OPTS="-XX:HeapDumpPath=/tmp/ -XX:+HeapDumpOnOutOfMemoryError [...resto de opciones...]"

Un Tomcat funcionando con estas opciones generará un fichero en /tmp llamado heap.hprof automáticamente cuando se produzca una OutOfMemoryException. Más información sobre esas opciones en Java HotSpot VM Options.

Una vez configurado de esta forma, ya sólo teníamos que esperar a que el Tomcat volviese a fallar. Y de eso estábamos seguros. Una vez con el fichero hprof generado podemos usar dos herramientas para procesarlo.

Una es VisualVM. Es de Sun y viene con el JDK de Java 6. Es el comando jvisualvm que se encuentra en el directorio bin del JDK. Con esta herramienta puedes navegar por los objetos que hay en memoria, ver las clases que más instancias tienen y que más consumen, etc. Te muestra lo que hay en memoria literalmente, pero para mi gusto es demasiada información en bruto y quizás sea complicado ver lo que está pasando.

La otra herramienta es Eclipse Memory Analyzer. Esta herramienta procesa la información y saca gráficas y estadísticas útiles. Incluso te propone posibles errores. Con esta herramienta fue con la que rápidamente descubrimos el error, ya que la gráfica de tarta de la ocupación de la memoria estaba al 75% ocupada por cierta parte de la aplicación. Se trataba de una de nuestras cachés. De ahí, muy hábiles nosotros, dedujimos que el proceso de limpiado de esa caché no estaba funcionando correctamente y por tanto, esta caché era un saco donde se metían cosas, pero nunca salían. :-p

Espero que esto os ayude a resolver este tipo de problemas si es que lo tenéis, y si no tienes problemas de este tipo, ¿nunca te has preguntado cuanto ocupa tu aplicación en memoria y qué objetos ocupan más? Merece la pena probar.

tomado de: http://www.latascadexela.es/2009/02/depurar-fugas-de-memoria-en-java-tomcat.html

jueves, 17 de enero de 2008

Sun Compra MySQL Excelente


De manera sorpresiva, se anuncia que Sun Microsystems adquiere MySQL.

Sun Microsystems anuncia acuerdo para adquirir MySQL, Desarrollador del motor de base de datos open source más popular del mundo.
El anuncio de prensa:

SANTA CLARA, CA Enero 16, 2006 Sun Microsystems, Inc. (NASDAQ: JAVA) anunció hoy que ha entrado en un acuerdo definitivo para adquirir MySQL AB, un ícono open source y desarrollador de una de las bases de datos open source de más rápido crecimiento por aproximadamente 1 billón de dolares en consideración total. La adquisición acelera la posición de Sun en empresa IT de incluír el mercado de bases de datos de 15 billones de dólares. El anuncio de hoy reafirma la posición de Sun como el proveedor líder de plataformas para la economía Web y su rol como el contribuidor open source comercial más grande.

Con millones de deployments globales incluyendo Facebook, Google, Nokia, Baidu y China Mobile, MySQL traerá sinergias con Sun que cambiarán el panorama de la industria del software llevando nuevas adopciones de la base de datos open source de MySQL en aplicaciones y empresas más tradicionales. La integración con Sun extenderá enormemente el atractivo comercial de las ofertas de MySQL y mejorará su proposición de valor con la adición de la organización global de servicios de Sun. MySQL también ganará nueva distribución a través de los canales de Sun incluyendo sus relaciones OEM con Intel, IBM y Dell.

(…)

“La cultura y modelo de negocioes de Sun complementa la de MySQL compartiendo los mismos ideales que hemos tenido desde nuestra fundación — libertad de software, innovación online y participación de la comundad y socios. Estamos tremendamente emocionados de trabajar con Sun y los millones de miembros del ecosistema open source de MySQL para continuar entregando la mejor base de datos para alimentar la economía web moderna” - Marten Mickos, CEO, MySQL.

La base de datos open source de MySQL es la “M” en LAMP - la plataforma de software comprendida por Linux, Apache, MySQL y PHP/Perl genrealmente vista como el cimiento de Internet. Sun está comprometido a mejorar y optimizar el stack LAMP en GNU/Linux y Microsoft Windows así como OpenSolaris y MAS OS X. La base de datos de MySQL, OpenSolaris y GlassFish, junto con la plataforma Java de Sun y comunidad de NetBeans, crearán una plataforma poderosa de aplicación web a través de un amplio rango de clientes llevando sus aplicaciones a la web.

Siguiendo la completitd de la transacción propuesta, MySQL estará integrado en el Software de Sun, organizaciones de Ventas y Servicios y el CEO de la compañía, Marten Mickos, se unirá al equipo de líderes ejecutivos de Sun. En el interin, un equipo conjunto de representativos de ambas compañías desarrollará planes de integración que construyan sobre las sinergias técnicas, productivas y culturales y las mejores prácticas de negocios y desarrollo de productos de ambas compañías.

En el blog de uno de los desarrolladores de MySQL, puede leerse:

Luego de toda la especulación de la industria sobre que MySQL sería un “IPO caliente de 2008″, ésto probablemente nos toma a todos por sorpresa - usuarios, comunidad, miembros, clientes, socios, y empleados. Y para todos los dueños de acciones, puede llevar un tiempo digerir qué significa ésto. Dependiendo de la relación de cada uno con MySQL, la reacción inmediata al oír estas noticias puede ser una mezcla de varios sentimientos, incluyendo emoción, orgullo, desconfianza y satisfacción, pero también ansiedad.

Siendo parte del grupo planeando éste anuncio por las últimas semanas, he tenido la fortuna de contemplar las consecuencias durante varias noches parcialmente sin dormir (generalmente duermo como un tronco). Y en los días y semanas que vienen, proveeré una serie de blogs con varios puntos de vista del asunto.

Sin duda una noticia excelente para los desarrolladores Open Source, la unión de dos gigantes con la misma ideología, no puede traer más que ventajas para los usuarios. Sin duda ambas compañías se van a ver beneficiadas por ésta adquisición.

Post Tomado de:
http://picandocodigo.net/index.php/2008/01/16/sun-compra-mysql/