10 Opciones de la JVM. Ejemplos de uso

Parámetros de la JVM en Java

Hay cientos de parámetros en la JVM u opciones en la JDK y prácticamente, resulta imposible hacer un seguimiento de todas las opciones de JVM, basándome en mi experiencia, ni siquiera usamos la mayor parte de indicadores JVM excepto un par de opciones de JVM importantes relacionados con el tamaño de la memoria Heap de la máquina virtual Java. EN ella se guardan las opciones de Java para la impresión de datos, de recolección de basura y breakpoints para la creación de la depuración remota en Java. Pero hay muchas otras categorías útiles los parámetros de la JVM que al menos podrían sernos útiles en algún momento o con menos frecuencia. En este artículo vamos a ver ejemplos de 10 categorías diferentes de parámetros JVM que me parecieron útiles:

Básicamente la especificación de parámetros en la JVM  puede ser dividido en dos partes:

  • Opciones de JVM que comienzan con-X:

Los parámetros de la JVM que empiezan con la opción -X no son estándar (esto significa que no está garantizado el soporte en todas las implementaciones de la JVM), y están sujetas al cambio sin notificación, en posteriores entregas de la JDK.

  • Opciones de la JVM que comienzan con-XX:

Las opciones o parámetros de la  JVM que se especifican con -XX no son estables y no son recomendados para el uso habitual. Estos parámetros están sujetos a cambio sin notificación igualmente.

Parámetros de la JVM para la memoria Heap, GC y Debug

Mientra escribía este artículo sobre las opciones de la JVM, me di cuenta las dos áreas principales de opciones de la JVM se centraban en “Java Heap Size” y “Java Garbage Collection”.

Un buen conocimiento de la JVM y sus opciones, especialmente para la mejora de GC, es importante para las aplicaciones que tienen tiempos críticos, por ejemplo aplicaciones de carga elevada y baja latencia. Un ejemplo real puede ser la búsqueda de vuelos en tour operación (donde actualmente trabajo), donde cada segundo importa. Es entonces cuando te das cuenta que la combinación correcta de parámetros requiere mucho trabajo de perfilado “profiling”, muchas pruebas, corrección y mejora.

Aspectos importantes sobre las opciones de la JVM

  1. Las opciones booleanas de la JVM pueden ser activadas con “-XX:+” y desactivadas con”-XX:-
  2. Las opciones numéricas de la JVM, pueden ser establecidas con “-XX:=” más una cantidad numérica, seguida de ‘m’ o ‘M’ para megabytes, ‘k’ o ‘K’ para kilobytes y ‘g’ or ‘G’ para gigabytes (por ejemplo: 32k es lo mismo que 32768).
  3. Las opciones de tipo cadena de caracteres de la JVM se establecen usando “-XX:=“, y normalmente se usan para establecer un archivo, ruta o lista de comandos.

El comando “java -help” muestra una lista de opciones (más o menos estándar entre las distintas implementaciones de la JVM) para la Java Application Launcher. El comando java -X puede ser usado para ver ver las opciones no estándar específicas de la JVM que estemos tratando en ese momento.
Para comprobar las opciones o argumentos que la JVM está ejecutando en estos momentos, podemos usar la llamada: ManagementFactory.getRuntimeMXBean().getInputArguments()

A continuación os muestro una lista de argumentos y opciones para la JVM que son los que más comunmente se usan cuando arrancamos aplicaciones Java:

1) Opciones de la JVM en relación al tamaño de memoria Heap

 

Las siguientes opciones son usadas para especificar, el tamaño inicial, máxima y tamaño del hilo de pila durante la ejecución de los programas de Java

-Xms establece el tamaño inicial de la memoria Heap de Java
-Xmx establece el tamaño máximo de la memoria Heap de Java
-Xss establece el tamaño del hilo de pila durante la ejecución de los programas de Java

2) Opciones de la JVM para mostrar los detalles del GC (recolector de basura)

-verbose:gc en los logs del GC muestran mientras se está ejecutando la recolección de basura, cuánta memoria han liberado y cuanto tiempo ha tardado. Generalmente es mi primera opción para comprobar si el GC es un cuello de botella para una aplicación.

-XX:+PrintGCDetails incluye la información de -verbose:gc pero también añade información sobre el tamaño de la regeneración y tiempos más precisos.

-XX:-PrintGCTimeStamps imprime “timestamps” de la recolección de basura.

3) Opciones de la JVM para especificar parámetros al GC (recolector de basura)

-XX:+UseParallelGC Establece que se use en paralelo las llamadas al recolector de basura, más eficaz en sistemas multiprocesador.
-XX:-UseConcMarkSweepGC Este colector puede proporcionar mejor tiempo de respuesta para una aplicación. Se trata de un colector paralelo y en su mayoría concurrente y puede ser un buen partido grandes sistemas multiprocesador.
-XX:-UseSerialGC Establece el uso en serie para la recolección de basura.

Ten cuidado con el uso de los parámetros para el GC si estas trabajando en aplicaciones con gran capacidad de datos y con tiempo de respuesta crítico. El tiempo del GC puede reducir en media el tiempo de respuesta de las operaciones así que deberemos comprobar qué parámetros son los más idóneos en nuestro caso.

4) Opciones de la JVM para el debug y el remote debug

Existen multitud de parámetros como los siguientes: -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 para saber más sobre remote debug podemos acceder a la página de Eclipse o de InteliJ para ello (no son objeto de nuestro artículo).

5) Opciones de la JVM relacionadas con el “profiling”

-Xprof  El perfilador Xprof  funciona mediante la ejecución de código Java en modo interpretado, durante la ejecución de un generador de perfiles en paralelo. Busca “puntos calientes” en el código, es decir, métodos que la JVM gasta una cantidad significativa de tiempo en marcha, y luego compila esos métodos en el código generado nativo.
-Xrunhprof es capaz de presentar el uso de CPU y estadísticas de asignación de la pila. Además, también puede informar del GC y los estados de todos los hilos en la máquina virtual Java.

6) Opciones de la JVM relacionadas con “Java classpath”

Xbootclasspath especifica las entradas al “classpath” que quiera cargar. La JVM verifica todas las clases que carga para asegurarse de que no tratan de eliminar la referencia de un objeto con un int, pop entradas adicionales de la pila o empujan demasiado, y así sucesivamente. Esta verificación JVM es muy estable, pero también es bastante costoso, y es responsable de una gran parte del retraso en la puesta en marcha. Poner las clases en la “bootclasspath” salta este costo, pero sólo se debe utilizar cuando se sabe las clases se han verificado antes. En JRuby, esto reduce el tiempo de arranque a la mitad o más por un simple script. La opción -Xbootclasspath se puede utilizar para anteponerse (/ p) o añadir (/ a) recursos para la ruta de clases bootstrap.

7) Opciones de la JVM para cambiar el tamaño de “Perm Gen”

Estas opciones de la JVM son muy útiles para resolver los problemas de tipo “java.lang.OutOfMemoryError:Perm Gen Space“.

-XX:PermSize and MaxPermSize
-XX:NewRatio=2 Ratio para la el tamaño de generación de la memoria “old” y “new“.
-XX:MaxPermSize=64m  tamaño de la la memoria permanente.

8) Opciones de la JVM para investigar la carga y liberado (descarga) de clases.

-XX:+TraceClassLoading y-XX:+TraceClassUnloading son dos parámetros de la JVM que se usan para imprimir el log de información según las clases se van cargando en la JVM o se van descargando/liberando de la JVM. Estos “flags” son extremadamente útiles si tienes fugas de memoria “memory leak” relacionados con el “classloader” y sospechas que ciertas clases no se están liberando o procesando por el colector de basura

9) Opciones de la JVM para alternar el “logging”

-XX:+TraceClassLoading y -XX:+TraceClassUnloading imprimen o muestran información de la carga o descarga/liberado de clases. Útil para investigar si tienes algún tipo de “class leak” por ejemplo si están siendo procesadas por el recolector de basura.

-XX:+PrintCompilation imprime el nombre de cada método Java decide compilar (JIT). La lista se suele mostrar un montón de métodos de la clase Java core inicialmente, para luego pasar a los métodos de la aplicación

10) Opciones de la JVM para fines de debug

-XX:HeapDumpPath=./java_pid.hprof Ruta al directorio que contiene el “head dump” o el volcado de memoria.
XX:-PrintConcurrentLocks Imprime  los “java.util.concurrent locks” de los volcado de pila “thread dumps“.
-XX:-PrintCommandLineFlags Imprime los “flags” que aparecen en la línea de comandos.

 

Estas son todas las opciones de la JVM que, según mi parecido” son bastante útiles. Entiendo que no es posible recordarlas y entender todas ellas, pero por lo menos a partir de ahora sabemos que existen y tenemos una mínima idea de para qué se usan.

Para una lista completa de las opciones de la JVM, por favor visita el sitio web de Oracle Java: Java Hotspot VM Options

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 )

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