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. |
This fact makes AppCDS difficult to use for real world deployments where a CI pipeline is responsible for building and deploying applications.
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:
|
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
When building container images using the quarkus-container-image-jib
extension, Quarkus automatically takes care of all the steps needed to generate the archive and make it usable at runtime in the container.
This way, by simply setting quarkus.package.jar.appcds.enabled
to true
, containers using the generated image can benefit from a slight reduction in startup time and memory usage.
You may see that Quarkus starts a container to generate the AppCDS archive.
It does this to ensure that the Java version of the build align with that of the generated container image.
It is possible to opt out of this by setting quarkus.package.jar.appcds.use-container
to false
.
In that case, it is your responsibility to ensure that the Java version that will run the Quarkus application matches that of the machine building it.