Conozca las opciones esenciales de JVM (Java Virtual Machine) para un mejor rendimiento y depuración.
Si eres un Desarrollador de Java o administrador de middleware, entonces debe saber qué significan las opciones de JVM junto con su importancia y cómo afectan a su aplicación. Averigüémoslos.
Descripción general de las opciones de JVM
Hablando de las opciones de JVM, existen tres tipos de opciones que puede incluir en su JVM: opciones estándar, no estándar y avanzadas. Si prueba una opción avanzada, siempre usa la opción con -XX
. Del mismo modo, si está aplicando una opción no estándar, utilice -X
. Las opciones estándar no anteponen nada a la opción.
¿Qué opciones de JVM utiliza su aplicación?
Si la aplicación se ejecuta en Linux, puede usar ps -ef | grep java
para identificar el proceso de Java y mirar las opciones de JVM impresas como argumentos de proceso. Si hay más de un proceso Java en el sistema, es posible que deba utilizar una palabra clave que sea exclusiva de su aplicación Java.
Si su argumento es demasiado largo, intente usar ps -auxww
ya que este comando también mostrará una larga lista de argumentos.
Después de tener una lista de indicadores de JVM, puede tener una idea sobre el comportamiento de cualquier aplicación Java, por ejemplo, Tomcat.
Java heap size
-Xms- establecer el tamaño del montón de Java inicial -Xmx- establecer el tamaño máximo del montón de Java -Xss- establecer el tamaño de la pila de subprocesos de Java
-Xms - Esta opción es para definir el tamaño de pila inicial para JVM, por ejemplo,Xms2048m
lo que significa que un tamaño de pila inicial de JVM es de 2 GB aproximadamente. Entonces, cuando se inicia una JVM, la memoria del montón será así de grande. ¡Sorprendentemente sí! Esto se lleva a cabo para evitar el cambio de tamaño durante el inicio y mejorar el tiempo de inicio de JVM.
-Xmx - Esta opción es para definir el tamaño máximo de pila de JVM, por ejemplo,Xmx2048m
lo que significa que el tamaño máximo de almacenamiento dinámico de JVM será solo de 2 GB.
Esencialmente siempre tendrás-Xms
y-Xmx
juntos.
Set Percentage of the heap
-XX: MaxHeapFreeRatio : Establece el porcentaje máximo de montón libre después de GC para evitar la reducción.
-XX: MinHeapFreeRatio - establece el porcentaje mínimo de montón libre después de GC para evitar la expansión; para monitorear el uso del montón, puede usar JCosole.
Enable class data sharing
Especificar Xshareclasses
opción para habilitar el intercambio de datos de clase en una caché de clase compartida. La JVM se conecta a una caché existente o crea una caché si no existe. Puede tener varias cachés y puede especificar la caché correcta agregando una subopción a la -Xshareclasses
.
PermGen Size
Las opciones de JVM anteriores definen el tamaño de la memoria dinámica, pero -XX:PermSize
es definir el tamaño del espacio de PermGen, donde se guardan el grupo de cadenas y los metadatos de la clase. Esta opción es particularmente efectiva para un servidor web como Tomcat, que a menudo carga clases de la aplicación web durante la implementación.
Por cierto, vale la pena darse cuenta de que el espacio de PermGen lo ocupa Metaspace en Java 8, y esta opción no es aplicable si está ejecutando JRE 8 JVM.
Print GC
-verbose: gc - registra las ejecuciones del recolector de basura y el tiempo que tarda. -XX: + PrintGCDetails - incluye los datos de -verbose: gc pero también agrega información sobre el tamaño de la nueva generación y tiempos más precisos. -XX: -PrintGCTimeStamps - Imprimir marcas de tiempo en la recolección de basura.
Estas opciones de JVM se utilizan para habilitar el registro de recolección de basura, que es muy eficaz para la operación sensible a la latencia. Solíamos estar en sistemas en los que buscamos latencias de microsegundos y, si lo reconoce, una gran recolección de basura puede durar varios milisegundos.
Por lo tanto, optamos por una arquitectura libre de GC como el disruptor LMAX, pero de hecho, si no opta por una aplicación ultra sensible a la latencia, esta práctica opción le aconsejará estadísticas importantes de GC. Le indicará si se trata de una recolección de basura grande o menor, qué tipo de recolector de basura se aplica, con qué frecuencia se restaura la memoria y cuánto tiempo se mantuvo, etc.
Handling ‘OutOfMemory’ Error
Para activar el volcado de pila sin memoria, puede usar -XX:+HeapDumpOnOutOfMemoryError
Esta opción de JVM produce un volcado de pila cuando su JVM muere con el error OutOfMemory. No hay ningún gasto involucrado a menos que realmente ocurra una OOM. Esta bandera es un requisito para los sistemas de producción, ya que suele ser la única forma de determinar el problema en profundidad.
El volcado de pila se configurará en el "directorio actual" de la JVM de forma predeterminada. Si desea crear volcados de pila en un directorio específico, ejecute
-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
El archivo de volcado de pila puede tener un tamaño enorme, hasta gigabytes, así que asegúrese de que el sistema de archivos de destino tenga suficiente capacidad.
Si queremos reiniciar el servidor inmediatamente después de que se agote la memoria, podemos establecer este parámetro con el mismo propósito:
XX:OnOutOfMemoryError="shutdown -r"
Trace classloading and unloading
-XX:+TraceClassLoading
y -XX:+TraceClassUnloading
son dos opciones de JVM que usamos para imprimir información de registro cada vez que las clases se cargan en JVM o se descargan de JVM. Estos indicadores de JVM son útiles si tiene algún tipo de fuga de memoria vinculada al cargador de clases y sospecha que las clases no se están descargando o recolectando basura.
Java classpath
Hablando de JAVA Classpath entonces-Xbootclasspath
especifica las entradas de classpath que queremos cargar sin verificación. La JVM verifica todas las clases que carga para asegurarse de que no intente eliminar la referencia de un objeto con un int, sacar de la pila entradas adicionales o empujar demasiadas, etc.
Poner la clase en bootclasspath también omite el costo, pero solo debe usarse cuando sepa que las clases se han verificado muchas veces antes. En JRuby, esto redujo el tiempo de inicio a la mitad y más para un script simple.
Profiling
La creación de perfiles de Java es el proceso de supervisión de varios parámetros de niveles de JVM, como ejecuciones de métodos, ejecuciones de subprocesos, recolecciones de basura y creaciones de objetos. La creación de perfiles de Java le proporciona una visión más detallada de la ejecución de la aplicación de destino y también de su utilización de recursos.
-Xprof
-Xrunhprof
64-bit environment
En el entorno del sistema operativo donde se instalan paquetes de 32 y 64 bits, la JVM elige automáticamente los paquetes de entorno de 32 bits como predeterminados.
Si queremos configurar el entorno a 64 bits manualmente, podemos hacerlo usando -d<OS bit>
parámetro. Y obviamente, el bit del sistema operativo puede ser 32 o 64.
Conclusión
Espero que esto le ayude a configurar los parámetros de JVM para su aplicación. Si está interesado en aprender en profundidad sobre la gestión de la memoria de Java, consulte este Curso Udemy.