Optimizar el rendimiento de las aplicaciones Java

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Los parámetros de la JVM se utilizan para configurar la Máquina Virtual Java (JVM), que se encarga de ejecutar el bytecode de Java. Al configurar adecuadamente los parámetros de la JVM, podemos mejorar el rendimiento de las aplicaciones Java. En este laboratorio, aprenderemos cómo establecer algunos parámetros de la JVM comúnmente utilizados para optimizar el rendimiento de las aplicaciones Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/output -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} java/classes_objects -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} java/exceptions -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} java/io -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} java/working -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} java/system_methods -.-> lab-117968{{"Optimizar el rendimiento de las aplicaciones Java"}} end

Establecimiento de la memoria del montículo

La memoria del montículo es el área de datos de tiempo de ejecución en la que se asignan los objetos Java. Podemos establecer el tamaño de la memoria del montículo con los parámetros -Xmx y -Xms.

  • -Xmx<tamaño del montículo>[unidad]: establece el tamaño máximo del montículo.
  • -Xms<tamaño del montículo>[unidad]: establece el tamaño inicial del montículo.

Por ejemplo, para establecer el tamaño mínimo del montículo en 512MB y el tamaño máximo del montículo en 1GB, podemos utilizar el siguiente comando:

java -Xms512m -Xmx1g MyApp

Elegir recolectores de basura

La recolección de basura es el proceso de liberar la memoria ocupada por objetos que ya no son utilizados por la aplicación Java. La elección del recolector de basura puede tener un impacto significativo en el rendimiento de la aplicación. La JVM proporciona varios recolectores de basura, cada uno con sus fortalezas y debilidades.

  • -XX:+UseSerialGC: habilita el recolector de basura serial, que utiliza un solo hilo para la recolección de basura.
  • -XX:+UseParallelGC: habilita el recolector de basura paralelo, que utiliza múltiples hilos para la recolección de basura.
  • -XX:+UseParNewGC: habilita el recolector de basura concurrent-mark-sweep (CMS), que utiliza múltiples hilos para realizar la recolección de basura concurrente.
  • -XX:+UseG1GC: habilita el recolector de basura Garbage-first (G1), que está diseñado para proporcionar tiempos de pausa consistentes y alta rendimiento.

Por ejemplo, para habilitar el recolector de basura paralelo, podemos utilizar el siguiente comando:

java -XX:+UseParallelGC MyApp

Registrar las actividades de recolección de basura

El registro de la recolección de basura nos permite monitorear el rendimiento del recolector de basura y ajustar los parámetros del recolector de basura según los requisitos de la aplicación. Podemos utilizar los siguientes parámetros para habilitar el registro de la recolección de basura:

  • -XX:+UseGCLogFileRotation: habilita la rotación de registros para los registros de recolección de basura.
  • -XX:NumberOfGCLogFiles=<número de archivos de registro>: limita el número de archivos de registro para los registros de recolección de basura.
  • -XX:GCLogFileSize=<tamaño del archivo><unidad>: especifica el límite de tamaño para los registros de recolección de basura.
  • -Xloggc:[ruta al archivo gc.log]: especifica la ruta para los registros de recolección de basura.

Por ejemplo, para habilitar el registro de la recolección de basura y establecer la ruta del archivo de registro en /path/to/gc.log, podemos utilizar el siguiente comando:

java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log MyApp

Manejo del error de memoria insuficiente

Cuando la JVM se queda sin memoria, lanza un error de memoria insuficiente. Podemos utilizar los siguientes parámetros de la JVM para manejar este error:

  • -XX:+HeapDumpOnOutOfMemoryError: cuando ocurre el error de memoria insuficiente, la JVM escribirá un volcado de memoria en el disco.
  • -XX:HeapDumpPath=<ruta al archivo de volcado de memoria>: especifica la ruta para el archivo de volcado de memoria.
  • -XX:OnOutOfMemoryError=<comando>: cuando ocurre el error de memoria insuficiente, la JVM ejecutará el comando especificado.
  • -XX:+UseGCOverheadLimit: la JVM utiliza esta opción para establecer un límite en la cantidad de tiempo dedicado a la recolección de basura.

Por ejemplo, para configurar la JVM para escribir un volcado de memoria en el archivo /path/to/heapdump.hprof cuando ocurre el error de memoria insuficiente, podemos utilizar el siguiente comando:

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp

Usando la JVM de 64 bits

Podemos utilizar el parámetro -d para seleccionar la JVM de 32 bits o 64 bits. Por ejemplo, para utilizar la JVM de 64 bits, podemos utilizar el siguiente comando:

java -d64 MyApp

Compilar y ejecutar una aplicación Java con parámetros de la JVM

Vamos a utilizar el programa HelloWorld.java para compilar y ejecutar la aplicación Java con los parámetros de la JVM que aprendimos en los pasos anteriores.

cd ~/proyecto
touch HelloWorld.java
touch HelloWorld.java

Ingrese el siguiente código:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hola, Mundo!");
    }
}

Guarde el archivo y salga. Ahora, compile y ejecute el código con el parámetro -Xmx:

javac HelloWorld.java
java -Xmx512m HelloWorld

Esto establece el tamaño máximo del montón en 512MB. Deberíamos ver la salida:

Hola, Mundo!

Compilar y ejecutar una aplicación Java con recolectores de basura

Ahora, vamos a compilar y ejecutar la aplicación Java con el recolector de basura paralelo:

java -XX:+UseParallelGC HelloWorld

Deberíamos ver la salida:

Hola, Mundo!

Compilar y ejecutar una aplicación Java con registro de recolección de basura

Ahora, vamos a compilar y ejecutar la aplicación Java con el registro de recolección de basura habilitado:

java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/ruta/al/gc.log HelloWorld

Esto establece la ruta del archivo de registro en /ruta/al/gc.log.

Compilar y ejecutar una aplicación Java con otros parámetros frecuentemente utilizados

Ahora, vamos a compilar y ejecutar la aplicación Java con los parámetros -XX:+UseStringDeduplication y -XX:MaxHeapFreeRatio:

java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld

Esto habilita la deduplicación de cadenas y establece la proporción máxima de espacio de montón libre después de la recolección de basura en un 70%.

Resumen

En este laboratorio, aprendimos cómo establecer varios parámetros de la JVM para optimizar el rendimiento de las aplicaciones Java. Aprendimos cómo establecer el tamaño de la memoria del montón, elegir recolectores de basura, habilitar el registro de recolección de basura, manejar errores de memoria insuficiente, usar la JVM de 64 bits y establecer algunos otros parámetros frecuentemente utilizados. También aprendimos cómo compilar y ejecutar una aplicación Java con parámetros de la JVM.