The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.
Edit this Page

AppCDS

Esta guía de referencia explica cómo habilitar Application Class Data Sharing en sus aplicaciones Quarkus.

¿Qué es el uso compartido de datos de clases de aplicaciones (AppCDS)?

La compartición de datos de clases de aplicación es una característica de la JVM que ayuda a reducir el tiempo de arranque y la huella de memoria de una aplicación JVM. Esto se consigue haciendo que la JVM cree un archivo compartido preprocesado de clases que se cargan en el momento del arranque. Como estas clases se cargan cada vez que se inicia la aplicación, AppCDS es una forma conceptualmente sencilla de mejorar el tiempo de inicio de la aplicación, sin que la propia aplicación tenga que codificarse o configurarse de una forma específica. El grado de mejora depende de muchos factores, como el número de clases cargadas, el hardware subyacente, etc.

Generación de AppCDS Vanilla

El principal inconveniente de crear AppCDS manualmente para una aplicación es que su generación requiere lanzar la aplicación con banderas especiales y obtener el archivo en un paso previo al despliegue de la aplicación en producción.

El proceso exacto depende de la versión de JVM que se utilice, ya que las nuevas JVM han ido facilitando el proceso.

Este hecho dificulta el uso de AppCDS para despliegues del mundo real en los que una tubería CI se encarga de crear y desplegar aplicaciones.

AppCDS en Quarkus

Creación del archivo

Quarkus hace que la generación de AppCDS sea tan sencilla como establecer la propiedad de configuración quarkus.package.jar.appcds.enabled en true. Para una aplicación Quarkus de ejemplo que utilice Maven (suponiendo que esté ubicada en /tmp/code-with-quarkus), el archivo AppCDS puede generarse simplemente construyendo la aplicación de la siguiente manera:

./mvnw package -Dquarkus.package.jar.appcds.enabled=true

Cuando finalice la compilación, la salida contendrá (entre otras cosas) lo siguiente:

[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] Launching AppCDS creation process.
[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] AppCDS successfully created at: '/tmp/code-with-quarkus/target/quarkus-app/app-cds.jsa'.
[INFO] [io.quarkus.deployment.pkg.steps.AppCDSBuildStep] To ensure they are loaded properly, run the application jar from its directory and also add the '-XX:SharedArchiveFile=app-cds.jsa' JVM flag.
Moreover, make sure to use the exact same Java version (x.y.z) to run the application as was used to build it.

Si echamos un vistazo a /tmp/code-with-quarkus/target/quarkus-app, entre los otros archivos, vemos app-cds.jsa, que es el archivo AppCDS generado.

Utilización del archivo

El uso del archivo se realiza mediante la bandera -XX:SharedArchiveFile. Sin embargo, se aplican algunas advertencias:

  • Las rutas de acceso al archivo jar de Quarkus y al archivo AppCDS deben ser exactamente las mismas que las utilizadas por Quarkus para crear el archivo.

  • La versión de la JVM utilizada para ejecutar la aplicación debe ser exactamente la misma que la utilizada para construir la aplicación Quarkus.

Asumiendo que estamos usando la misma JVM para ejecutar la aplicación que la que usamos para construir la aplicación, podemos lanzar la aplicación así:

cd target/quarkus-app
java -XX:SharedArchiveFile=app-cds.jsa -jar quarkus-run.jar

La JVM es resistente. Enfrentada a una situación en la que el fichero de archivo no es utilizable (por la razón que sea), simplemente desactivará la función AppCDS.

Si se desea simplemente detener la ejecución cuando el archivo no es utilizable, se puede utilizar la siguiente invocación de línea de comandos:

java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar quarkus-run.jar

Dado lo que se mencionó anteriormente acerca de cómo la aplicación necesita ser lanzada para que el archivo sea construido, surge la pregunta de cómo Quarkus se ocupa de esta situación.

La respuesta es que en el momento de construir la aplicación, justo después de construir el archivo de la aplicación, Quarkus lanza la aplicación, pero sólo se ejecutan las partes del proceso de lanzamiento que son seguras. Más concretamente, la aplicación se ejecuta hasta los pasos que realmente abren sockets o ejecutan la lógica de la aplicación.

El resultado es un proceso de generación de archivos que, por un lado, es completamente seguro, pero por otro lado, es incapaz de archivar todas y cada una de las clases que la aplicación pueda necesitar en el momento del arranque. Como resultado, se espera que los usuarios obtengan un archivo ligeramente más eficaz si pasan manualmente por el aro de la generación del archivo AppCDS.

AppCDS ha mejorado significativamente en las últimas versiones del JDK. Esto significa que, para garantizar las mejores mejoras posibles, asegúrese de que sus proyectos se dirigen a la versión de Java más alta posible (idealmente 17 o 21).

Uso en contenedores

Cuando se construyen imágenes de contenedor utilizando la extensión quarkus-container-image-jib, Quarkus se encarga automáticamente de todos los pasos necesarios para generar el archivo y hacerlo utilizable en tiempo de ejecución en el contenedor.

De este modo, con sólo configurar quarkus.package.jar.appcds.enabled en true el contenedor generado puede beneficiarse de una ligera reducción del tiempo de arranque y del uso de memoria.

Related content