JEP 544: compilación de código anticipada (ahead-of-time) en la JVM HotSpot

Fuentes: JEP 544: Ahead-of-Time Code Compilation

La JEP 544, propuesta para OpenJDK por John Rose, introduce la compilación anticipada (AOT) de código de aplicación dentro de la caché AOT existente, con el objetivo de reducir los tiempos de arranque y calentamiento de la JVM HotSpot. La idea central es ejecutar un entrenamiento previo que genere código nativo optimizado y lo almacene en la caché AOT para reutilizarlo en ejecuciones productivas posteriores, de modo que el código nativo esté disponible desde el primer instante en lugar de tener que producirlo el compilador JIT en cada arranque.

El mecanismo se apoya en dos JEPs complementarias: la 483, que define la propia caché AOT y la carga e linkage anticipados de clases, y la 515, que añade el perfilado anticipado de métodos. La 544 aporta la pieza que faltaba: almacenar en esa caché el código nativo optimizado generado por el compilador C2 a partir de los perfiles recogidos en el entrenamiento. Cuando la carga de trabajo cambia en producción, la JVM desoptimiza y recompila dinámicamente con JIT, manteniendo el rendimiento óptimo.

Entre los objetivos figurent que las aplicaciones alcancen y sostengan el rendimiento pico más rápido; que no haga falta modificar el código de aplicaciones, bibliotecas ni frameworks; que baste con solicitar el uso de la caché AOT sin reconfigurar HotSpot; mantener la compatibilidad con los recolectores Serial, Parallel, G1 y ZGC; y soportar arquitecturas AArch64 y x64. Quedan fuera del alcance un modo exclusivamente AOT, la compilación cruzada entre CPUs distintas y el soporte universal de arquitecturas.

La JEP justifica el diseño argumentando que la compilación dinámica aporta tres ventajas sobre la estática — adaptabilidad a cambios en los hot spots, portabilidad entre entornos y compatibilidad con rasgos dinámicos del lenguaje como carga de clases, despacho y reflexión— que la compilación puramente estática no puede igualar sin restricciones graves. Al mover parte del trabajo de compilación a entrenamientos previos, HotSpot conserva la agilidad del JIT pero elimina el coste inicial de generar el código nativo en cada arranque.