Java Mission Control

A partir del JDK 7 update 40 está incluido Java Mission Control una aplicación para analizar métricas de rendimiento de aplicaciones que se ejecutan en la máquina virtual que es terriblemente fácil de usar.

Con esta aplicación probé lo que escribí en mi anterior artículo para ver hasta que punto me equivoqué. El objetivo es comprobar cuantos GCs ejecutan y la duración del conjunto en una ejecución con los parámetros -Xms1G -Xmx1G y en otra sin -Xms1G para comprobar si penaliza el redimensionamiento del heap.

El programa ejecutado consume de media por iteración (ejecuta 10 iteraciones) unos 640 MB. Es el tamaño que le paso por parámetro para que cree un array de 640 M de bytes ya que con un máximo de 1 GB para el heap un tamaño mayor que 640 MB provoca una OutOfMemoryException. El resto ocupado será memoria reservada (o virtual).

Para crear un archivo con las métricas y sólo el parámetro -Xmx1G ejecuto:

java -Xmx1G
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording=duration=10s,
filename=record-gcing1G_NoXms1G.jfr,
settings=settings.jfc
GCing 640

Xmx1g

Flight Recording es el módulo encargado de grabar las métricas que posteriormente se analizan con Java Mission Control. Se activa con los flags –XX:+UnlockCommercialFeatures -XX:+FlightRecorder y -XX:StartFlightRecording al que se incluyen parámetros como la duración de la grabación, el nombre del archivo que creará y el nombre de la plantilla de métricas que tiene que tomar.

Esta plantilla se crea y exporta con Java Mission Control en el menú Window y la opción Flight Recording Template Manager. Este módulo por defecto no recoge las métricas específicas del GC, para que lo haga hay que indicarle una plantilla creada con JMC en la que se haya seleccionado all para Event Options GC.

Para crear el segundo archivo de métricas con parámetros -Xms1G y -Xmx1G ejecuto:

java -Xms1G -Xmx1G
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording=duration=10s,
filename=record-gcing1G_Xms1G.jfr,
settings=settings.jfc
GCing 640

Xmxs1GXmx1G

Sin establecer un tamaño de heap inicial se ejecutan 20 procesos GC ya sean DefNew o SerialOld durando poco más de 52 milisegundos mientras que estableciendo 1G de heap inicial (porque se ha medido que la aplicación consume de media 640 MB) se ejecutan 18 procesos de GC que en total duran un poco más de 46 milisegundos. Estos datos se pueden ver en la pestaña izquierda Memory y pestañas inferiores Garbage Collections, GC Times y Allocations.

Como conclusión no se puede decir que la mejora en reducción del tiempo de ejecución sea sustancial porque casi es despreciable usando -Xms1G, pero en el JDK ahora tenemos una gran herramienta muy fácil de usar que pone en bandeja un montón de métricas que no costará nada analizar cuando se perciba un rendimiento pobre.

Enlace a zip con grabaciones, plantilla y código fuente.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s