JBoss EAP: Configuración de la memoria

JBoss EAP: Configuración de la memoria


Una de las tareas de afinamiento más comunes luego de comenzar a operar un servidor de aplicaciones Java suele ser el ajuste de la memoria que utiliza el Java Virtual Machine (JVM). Por defecto, cierta cantidad de memoria es asignada al momento de iniciar el JVM, esta memoria es utilizada para alojar los objetos creados por las aplicaciones y para mantener otra información creada durante la ejecución de las mismas. El valor inicial suele ser suficiente para iniciar a operar pero ciertas aplicaciones necesitarán una mayor cantidad de recursos ya sea de entrada o con el tiempo para cubrir una mayor demanda por parte de los usuarios.

 

Si la cantidad de memoria asignada es insuficiente para la demanda inicial de las aplicaciones o para soportar la carga que reciban éstas, entonces eventualmente se podría experimentar lentitud o la cancelación de las peticiones, llegando a la temida excepción de Java: java.lang.OutOfMemoryError, que se presenta cuando el JVM es incapaz de crear un objeto en memoria y en este punto será necesario reiniciar el servidor, con la correspondiente afectación a los usuarios conectado o nuevos que estén por llegar.

 

En esta entrada se va a considerar los pasos a seguir para modificar la cantidad de memoria que es asignada al JVM del servidor de aplicaciones JBoss Enterprise Application Platform (EAP) en su versión 7 en modo Standalone y utilizando Java 11, aunque para Java 8 los pasos son similares.

 

El punto de partida será que contamos con servidor JBoss EAP instalado y aplicada su configuración básica. Para llegar a este punto se puede tomar como referencia la entrega inicial de esta serie de artículos: JBoss EAP: Instalación y configuración básica

Algunos conceptos básicos

Tipos de memoria

En Java 11 existen dos tipos principales de memoria del JVM:

Heap

Corresponde al espacio donde se alojarán los objetos y arreglos que son utilizados por las aplicaciones. El tamaño del Heap varía mientras se ejecutan las aplicaciones.

 

Existen dos parámetros que podemos utilizar para modificar el espacio utilizado por el Heap, éstos son:

-Xms: Valor inicial

  • -Xmx: Valor máximo que podría tomar
  •  
  • Non-heap

El espacio más relevante dentro de lo que no sea Heap se lo conoce como Metaspace y es donde se almacena la metadata, estructura de las clases, constantes, valores de los String, entre otros.

 

Desde la versión 8 de Java encontramos los siguientes parámetros para lo que se conoce como Metaspace:

 

-XX:MetaspaceSize: Valor inicial para almacenar los elementos del Non-heap

-XX:MaxMetaspaceSize: Valor máximo que podría tomar el espacio de Non-heap

 

Nota: Antes de Java 8, se lo conoce como Permanent Gen y los parámetros eran -XX:PermSize y -XX:MaxPermSize, equivalentes a los antes mencionados.

Gestión de la memoria

Es bien conocido que como desarrolladores no tenemos que liberar de manera explícita la memoria que ya no estemos utilizando, a diferencia de otros lenguajes de programación como C++. Y ésto es debido a que Java dispone del Garbage Collector, un componente del JVM que es el encargado de monitorear y liberar el espacio de memoria que ya no está en uso.

Procedimiento de ajuste de la memoria

Heap

Cuando encontremos la excepción java.lang.OutOfMemoryError en el archivo de log  ($EAP_HOME/standalone/server.log)  de JBoss EAP podremos tener la certeza de que se va a requerir un incremento en la memoria Heap.

 

Para el modo Standalone de JBoss EAP simplemente se deberá cambiar el archivo standalone.conf, el cuál está ubicado en el directorio $EAP_HOME/bin/

Procedimiento de ajuste de la memoria

 

Según el archivo del ejemplo, se puede ver que en línea 53 están los valores correspondientes para -Xms y -Xmx, en este caso ambos establecidos en 1303 MB.

 

NOTA: Para ambientes productivos se recomienda establecer -Xms y -Xmx con el mismo valor, así no se tiene que gestionar el incremento hasta el valor máximo sino que ya está establecido de antemano.

Metaspace

Usualmente no existe la necesidad de especificar un tamaño máximo para Metaspace a menos que se esté presentando una pérdida de memoria (memory leak), que resulta de la falta de liberación de la misma una vez que ya no se la necesita, afectando al rendimiento del servidor.

Conclusiones

Dentro de los ajustes que podemos hacer a un servidor de aplicaciones, como JBoss EAP, el espacio Heap es el principal ya que es el más dependiente de la dinámica de nuestras aplicaciones y de la exigencia que reciba por parte de sus clientes.

 

La modificación del tamaño del espacio Heap es una tarea sencilla pero requiere el reinicio del servidor de aplicaciones, y como pudimos evidenciar son instrucciones que recibe el JVM al momento de iniciar el mismo. Estos parámetros son los mismo que aplican para cualquier servidor de aplicaciones que se ejecute sobre la máquina virtual de Java (JVM).

 

Otras modificaciones, como el cambio del Metaspace no son tan habituales, sin embargo podría ser necesarias cuando las aplicaciones mantienen un número extenso de clases o gestionan muchos valores del tipo String.

 

Te hacemos una cordial  invitación ya que en próximas entradas del blog habrá más contenido sobre esta temática. Hasta pronto.

leave a comment