Java: Entendiendo los parámetros Xmx y Xms (parte I)

Recientemente he recibido una notificación del CPD donde uno de “mis clientes” alojan una aplicación web Java™ desarrollada por mi equipo advirtiéndome de que la misma estaba consumiendo grandes cantidades de memoria (más de 1 Gb) que aparentemente no se recuperaba (sube de modo gradual sin llegar a liberar).

La razón, lejos de ser un problema de la aplicación en cuestión, es más bien un comportamiento correcto acorde con los parámetros de configuración de la máquina virtual asignados por parte de los administradores del servidor de aplicaciones que, en concreto, eran -Xms500m -Xmx1700m.

Estos parámetros explican perfectamente este comportamiento. Veamos la teoría:

  • Xms: Indica el tamaño mínimo del heap que ha de reservar la máquina virtual.
  • Xmx: Indica el tamaño máximo del heap.

Veamos ahora que ocurre en la práctica:

1.- Añadimos el siguiente parámetro a la máquina virtual para poder monitorizar remotamente nuesta aplicación-cobaya:

-Dcom.sun.management.jmxremote

2.- Fijamos los parámetros Xmx y Xms por ejemplo así:

-Xmx512m
-Xms128m

3.- Ejecutamos la consola de Java usando el comando jconsole (viene de serie con el JDK) y nos conectamos el agente correspondiente a la aplicación a testear.

agente

4.- Ahora podemos ver, tras hacer click en la pestaña “memory” y meter caña a la aplicación en paralelo, la gráfica de memoria. Para los parámetros antes fijados dicha gráfica debería ser similar a esta.

-Xmx512m

-Xmx512m

Como se puede observar la memoria usada del heap va aumentando escalonadamente hasta aproximarse al especificado en el parámetro Xmx. Una vez llegado a lo alto del pico el GC limpia y el uso de memoria cae en picado para volver de nuevo a empezar el ciclo.

Si por ejemplo fijamos el parámetro Xmx a 128 megas el pico máximo sería precisamente un valor próximo a esa cantidad. La gráfica sería similar a la anterior aunque las iteraciones serían, como es lógico más cortas:

-Xmx128

-Xmx128

En próximos posts mostraré el comportamiento en casos de andar escasos de memoria, fijar valores muy bajos, como tunear estos parámetros, etc.

About these ads

4 Responses to “Java: Entendiendo los parámetros Xmx y Xms (parte I)”


  1. 1 Fran julio 14, 2009 en 08:53

    Me ha parecido muy interesante, hacia tiempo que no miraba cuestiones de este tipo y me ha alegrado la mañana.

  2. 2 Marcos noviembre 26, 2009 en 18:39

    Hola,

    el post me ha parecido muy bueno y a partir de él he comenzado una ardua tarea para mejorar el rendimiento de mis aplicaciones.
    Aparte de estos valores, he visto muy importante tocar otras variables que controlan parte de memoria llamada “PermGem”.

    Sería muy interesante que hicieras una ampliación de este post viendo los valores óptimos de memoria para varias situaciones concretas.
    Si necesitas ayuda o quieres que te cuente información de lo que he logrado, no dudes en contactarme.
    Un saludo

  3. 3 Zodraz diciembre 23, 2009 en 18:45

    Muy buen post! Claro y senzillito!!!

  4. 4 Daniel_Laixer octubre 21, 2010 en 20:37

    Gracias, a mí me ha servido también, aunque para algo más banal. Juego al Minecraft y después de un rato el juego se ralentiza. En la web del juego recomiendan uno parámetros Xmx y Xms, pero voy a ver si con la jconsole puedo monitorizar el proceso y ver como actúa con distintos valores :D


Deja un comentario

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 )

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 )

Google+ photo

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

Conectando a %s




Add to Technorati Favorites
Clicky Web Analytics Clicky

Flickr Photos

Aljibe

luz

C1

C1

Más fotos

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: