GraalVM – Ejecutables nativos

Requerimientos de arquitectura para la nube (cloud-native)

A medida que la adopción de los servicios en la nube se va generalizando, el despliegue de aplicaciones se ha desplazado hacia una arquitectura modularizada, distribuida, asíncrona y capaz de ajustar rápidamente la cantidad de instancias en ejecución en función de la demanda (elasticidad de la infraestructura).

Específicamente, cada módulo en una aplicación para la nube debe satisfacer mínimamente los siguientes requerimientos:

  • Tamaño reducido en términos de consumo de memoria y CPU. Este aspecto es fundamental para reducir el costo total de propiedad en modelos de pago por uso típicos de la nube.
  • Arranque rápido. Para asegurar un buen grado de disponibilidad, un proceso debe estar listo para aceptar solicitudes lo más antes posible.

Compilación anticipada, imagenes nativas y SubstrateVM

La compilación anticipada (AOT compilation) se emplea para crear binarios nativos para un determinado SO/arquitectura. Para despliegues es la nube, es la herramienta ideal para obtener artefactos más pequeños, inicios más rápidos que además incluyan el mismo entorno de ejecución.

GraalVM viene con una herramienta llamada native-image que se utiliza para realizar compilación anticipada y generar imágenes nativas. native-image compila el código en un archivo que puede ejecutarse sin una maquina virtual. El ejecutable incluye todas las clases, dependencias, bibliotecas y lo que es más importante, todas las funcionalidades de la máquina virtual, como la gestión de la memoria, gestión de subprocesos, etc. SubstrateVM es la máquina virtual que se incluye en el archivo ejecutable durante la compilación de código en imágenes nativas.

La imágenes nativas solo pueden incluir optimizaciones como resultado del análisis estático del código; no es posible incluir optimizaciones que resultan del análisis en tiempo ejecución aplicados por compiladores de tiempo de ejecución (Just-In Time compilation).

Actualmente, ya se encuentran disponibles muchos frameworks para desarrollar aplicaciones nativas de la nube empleando la herramienta native-image de GraalVM, por ejemplo: Quarkus , Micronaut, Helidon, Spring o Fn. El desempeño de aplicaciones desarrolladas con estos frameworks puede mejorar hasta 50 veces cuando se ejecutan como una imagen nativa.

Generación de un ejecutable a partir de un clase compilada (*.class)

Una vez instalados los requisitos de la plataforma para la cuál se desea generar el ejecutable nativo, el procedimiento para generar dicho artefacto a partir de un archivo *.class es el siguiente:

Análisis del ejecutable nativo empleando el GraalVM Dashboard

GraalVM Dashboard es una aplicación web que permite visualizar el contenido de una imagen nativa con el objetivo de buscar oportunidades para reducir su tamaño.

Agente de rastreo

Si la aplicación Java utiliza reflexión, debemos crear el archivo META-INF/nativeimage/reflect-config.json para incluir clases que se cargan empleando reflexión. También es posible configurar otras características dinámicas de Java como JNI, proxies o recursos del classpath. Los archivos de configuración deben estar en el CLASSPATH para que el compilador AOT pueda incluir estos recursos en la imagen nativa.

GraalVM incluye un agente de rastreo que facilita la generación de los archivos de configuración necesarios para generar la imagen nativa de una aplicación que usa características dinámicas de Java.

En el siguiente vídeo se muestra cómo usar el agente de rastreo:

Referencias

Comments are closed.