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

viernes 25 de noviembre de 2011

miércoles 27 de julio de 2011

Problemas con el calendario en Reporting services en produccion IIS7

Bueno me encontre con un problema con reporting services 2008 r2 en IIS 7, en desarrollo me mostraba los calendarios de los parametros tipo date time, pero en produccion no no cargaba el icono y al dar click saca un erro 404, buen pues aqui esta la solucion

se necesitan estas claves en web.config

 

It seems the two lines are needed:

<httpHandlers>           
            <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
</httpHandlers>

And,

<system.webServer>
        <handlers>
           <add name="ReportViewerWebControl" path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </handlers>
</system.webServer>

 

viernes 10 de junio de 2011

Cómo matar un proceso en PostgreSQL de forma segura

Cómo matar un proceso en PostgreSQL de forma segura

PostgreSQL Si algún proceso se queda colgado (aunque no sea debido directamente a postgres) se puede cancelar sin causar males mayores al postmaster. Primero averiguamos el id del proceso gestionando nuestra query y luego le mandamos un SIGTERM (-15):


psql template1
template1=# select procpid, datname, usename, waiting from pg_stat_activity ;
procpid | datname | usename | waiting
---------+----------+----------+---------
27702 | template1 | postgres | f
27710 | template1 | postgres | f
27756 | template1 | postgres | f
27720 | template1 | postgres | t
(4 rows)
q
su -
kill -15 27720

Fuente: http://s1lence.net

martes 2 de noviembre de 2010

Link para consultar su datacredito en linea

Es relativamente dificil encontrarlo, lo pueden buscr en la pagina de datacredito y luego buscan donde dice mapa del sitio y se meten a consultas en linea

http://www.datacredito.com/wpsv6/wps/portal/Personas/ConsulteSuHistoriaDeCredito/OtrosMediosDeConsulta

actualizado el 28 de feb de 2011

Nuevo Link

https://www.datacredito.com.co/ciudadanos/web/index.html

jueves 30 de septiembre de 2010

Les comparto el pensamiento de un gran amigo, y que comparto plenamente

Hace nueve años atrás, los titulares de los noticieros del medio día anunciaban de manera tradicional y poco desconcertante la toma guerrillera efectuada en la mañana o en la noche anterior por parte de las FARC, en muchas de las oportunidades era en un municipio del suroccidente colombiano y en especial en el departamento del Cauca. Desde hace algunos días los titulares de los noticieros vienen informando de los duros golpes efectuados por las fuerzas armadas de Colombia a las FARC, eso me hace recordar, que hace algunos años cuando apenas cursaba mis primeros semestres de derecho afirme ante algunos compañeros que si las FARC llevaban 50 años de presencia en nuestro territorio, por lo menos nos tocaría combatirlas de manera frontal durante 25 años para lograr ver resultados reales; la verdad, es que después de nueve años de haber asumido esa posición, considero que el avance militar del estado en la lucha contra las FARC es incomparable, el presidente Uribe nos enseñó que el derecho a la seguridad y a vivir de manera esperanzadora nuestros sueños, es posible concretarlos en nuestra amada patria; hoy los colombianos, sabemos que el derecho a la seguridad es innegociable y que debe seguir siendo una política de estado. El gran reto que debemos asumir los jóvenes de la generación X es no olvidar la historia que vivimos en nuestra infancia y adolescencia, luchar día a día con acciones pequeñas pero persistentes en hacer de nuestra sociedad una comunidad de personas mas solidarias, honestas y comprometidas con el desarrollo, respetando el medio ambiente, los derechos fundamentales y el derecho a construir conocimiento en la diferencia. Hoy nuestro nietos están mas cerca de vivir en una gran país, eso depende de todos nosotros, de nuestras acciones, pero en especial de no seguir cayendo en las omisiones que nuestros padres y abuelos tuvieron que caer; animo para combatir la corrupción, animo para hablar bien de nuestra patria en el exterior, animo para soñar y hacer soñar con nuestras palabras y actos a quienes no conocen a nuestro país; cada pesito que los corruptos se apropian es un pesito que nuestros nietos no verán para desarrollar su país, para mejorar en salud o incluso un pesito menos para su pensión. Este pedacito de tierra lo tomamos prestado de nuestro hijos y nietos.

POR FERNANDO HERNÁNDEZ VÉLEZ