Análisis de programas Java (profiling)
Cuando construimos una aplicación Java, normalmente, no debemos de tratar de
hacerlo
optimizando…. (aunque esto no quita para utilizar técnicas sencillas que
sabemos que mejora el rendimiento de los programas).
Cuando ya hemos construido nuestra aplicación ( y hemos resuelto los problemas
de negocio), tenemos que darle otra vuelta y optimizar los puntos más críticos…
Si no lo hacemos por este orden …. es bastante fácil perder el norte.
Java nos proporciona unos comandos (opciones de comando Java) sencillos para ejecutar nuestra aplicación
y entender que está sucediendo por dentro.
Os vamos a mostrar como funcionan estas opciones con el jdk 1.4
Comandos para la optimización
Si vamos a la línea de comando y ejecutamos java -X, obtenemos la ayuda de
los comandos extendidos …
C:\java\optimizacion>java -X -Xmixed mixed mode execution (default) -Xint interpreted mode execution only -Xbootclasspath:<directories and zip/jar files separated by ;> set search path for bootstrap classes and resources -Xbootclasspath/a:<directories and zip/jar files separated by ;> append to end of bootstrap class path -Xbootclasspath/p:<directories and zip/jar files separated by ;> prepend in front of bootstrap class path -Xnoclassgc disable class garbage collection -Xincgc enable incremental garbage collection -Xloggc:<file> log GC status to a file with time stamps -Xbatch disable background compilation -Xms<size> set initial Java heap size -Xmx<size> set maximum Java heap size -Xss<size> set java thread stack size -Xprof output cpu profiling data -Xrunhprof[:help]|[:<option>=<value>, ...] perform JVMPI heap, cpu, or monitor profiling -Xdebug enable remote debugging -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions The -X options are non-standard and subject to change without notice. |
Vamos a prestar atención solo a una de las opciones ….
(ya veremos en el futuro algunas más)
java –Xrunhprof optimizacion
Al ejecutar este comando, se genera un fichero (java.hprof.txt)
con toda la información relativa a la ejecución del programa.
El fichero generado es un poco duro de seguir…… así que
vamos a utilizar una herramienta gratuita para simplificar la labor, que podemos utilizar gracias a HP. Si
vamos a su Web, podemos encontrar recursos de gran calidad relativos al
rendimiento en Java.
Una de las herramientas más interesantes (para todos los
entornos) es HPjmeter…
Accedemos a al enlace…. (aceptamos la licencia) y descargamos el fichero
http://www.hp.com/products1/unix/java/hpjmeter/downloads/license_hpjmeter.html
El fichero es un ZIP que contiene otros ficheros. Los descomprimimos en el
directorio deseado.
Ahora, podemos arrancar la herramienta, ejecutando el comando:
java -jar HPmeter.jar
Nada más arrancarla, podemos observar su aspecto
Vamos a nuestro directorio y accedemos al fichero que se ha generado (al
ejecutar java –Xrunhprof optimizacion)
Y podemos ver los parámetros más sencillos… Ahora, recorriendo
los menús, podemos acceder a elementos vitales …. objetos creados, memoria
perdida, etc.
Análisis de nuestro programa
Teniendo una herramienta como ésta…. podemos empezar a
plantearnos donde están los problemas de rendimiento, memoria, etc.
public class optimizacion { public static void main(String [] cadenas) { long tiempoInicial = System.currentTimeMillis(); ejecutaProceso(); long total = System.currentTimeMillis() - tiempoInicial; System.out.println("El tiempo es " + total); } static void ejecutaProceso() { for(int i=0; i |
Es posible.. que nos llevemos alguna (no grata) sorpresa …. solo tenemos que
ver la siguiente pantalla y comprobar el uso tan poco óptimo de los recursos…
Creación de Herramientas similares
Nosotros podemos crear nuestras propias herramientas para
perfilar el funcionamiento de nuestros programas.
Podéis encontrar la especificación en:
http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html
Francamente… creo que no es nuestro objetivo (aunque será un
buen proyecto de fin de carrera… así que tomar nota) pero si queréis
saber un poco más sobre como hacerlo, podéis encontrar un proyecto en sourceforge.org.
Conclusiones
En numerosas ocasiones nos preocupamos de aprender cientos de
nuevas APIs y no sabemos manejar bien el lenguaje ni las básicas (bucles,
declaración de variables, excepciones, colecciones, etc..). Gracias a estas
herramientas podemos aprender a mejorar el comportamiento de nuestras
aplicaciones…
El mundo Java no es muy complejo aunque sí excesivamente
amplio…..