Tuning JVM

¿Qué son los argumentos de la máquina virtual de java (JVM)?

Son opciones de línea de comandos y variables de entorno que pueden afectar a las características de rendimiento y comportamiento de la máquina virtual Java (JVM). A continuación nombro los 3 tipos de argumentos que existen y detallaré algunos de los más utilizados.

¿Dónde se pueden aplicar dichos argumentos?

Se puede aplicar en numerosos sitios, desde entornos de desarrollo integrados que corren sobre la maquina virtual de java (Netbeans, Eclipse), hasta la ejecución de un jar por línea de comandos ejemplo:

Tipos de argumentos

Standard – Son los argumentos más básicos, estos argumentos no suelen cambian por cada versión de JDK. Para listar las opciones estándar ejecutar en la consola:

Non-Standard – En este tipo se encuentran los argumentos más utilizados para la gestión de memoria (Xms, Xmx y Xss). Estos argumentos pueden cambiar por cada versión de JDK sin previo aviso. Para listar las opciones no estándar ejecutar en la consola:

Hidden – Estos argumentos son experimentales y pueden llegar a cambiar por cada versión JDK y sistema operativo. Los argumentos de este tipo empiezan por -XX.

Algunos de los argumentos más utilizados

-Xms Este valor indica la cantidad de memoria asignada al iniciar la máquina virtual de java. Mi recomendación para el valor de este argumento es que corresponda a la mitad Xmx o en el caso de servidores al mismo valor que el Xmx.

-Xmx Este valor indica la memoria máxima que podrá alcanzar la maquina virtual de java. Un valor bajo de este argumento puede hacer que la ejecución del código en la JVM lance una excepción de tipo java.lang.OutOfMemoryError, aumentando este argumento podemos evitar este problema.

-Xss Este valor indica la cantidad de memoria de pila por hilo de ejecución. Este parámetro por defecto suele estar en 512k, dependiendo del Sistema operativo y arquitectura del mismo. Cuando se producen excepciones del tipo java.lang.StackOverflowError es recomendable ajustar una mayor memoria de pila por hilo. Un valor muy alto puede ser contraproducente, puesto que el sistema se puede quedar sin memoria para crear nuevos hilos de ejecución.

-Xmn Este valor controla la cantidad de espacio del almacenamiento dinámico que puede consumir la generación joven (llamado Eden), un valor bajo indica que el Garbage Collector se ejecute muchas veces sin tener realmente nada que limpiar y un valor muy alto puede hacer que los objetos basura salgan de la memoria “Eden” de la JVM y se introduzcan en la memoria de generación vieja.

-XX:MaxPermSize Este argumento indica la cantidad de memoria Non-Heap/perm máxima, esta memoria se utiliza para cargar parte de código que utilizara la JVM. Aumentando este parámetro conseguiremos evitar que se produzcan excepciones del tipo java.lang.OutOfMemoryError: PermGen space.

Eclipse

A continuación pondremos en práctica los anteriores parámetros para nuestro eclipse, independientemente del lenguaje en el que programemos ya sea PHP, Java,… La mejor forma para aplicar los argumentos, es editando el fichero eclipse.ini. Dependiendo de nuestro sistema operativo y arquitectura del procesador funcionaran unos argumentos y otros no.  Para un Windows 32bits 3Gb RAM esto es un extracto del eclipse.ini que yo utilizo.

Para quien utilice Netbeans, puede configurar la JVM en la que corre Netbeans de esta forma: http://performance.netbeans.org/howto/jvmswitches/

¿Y tú qué argumentos usas?