Java 25, la próxima versión LTS, incorpora de forma nativa el soporte para Compact Object Headers mediante la JEP 519. Esta característica, que era experimental en Java 24, ahora se promueve como una funcionalidad oficial del VM, lo que implica grandes beneficios sin necesidad de modificar el código existente.
¿Qué son los Compact Object Headers?
En HotSpot (el JVM de referencia), cada objeto en memoria tiene un cabecera (header) que contiene meta información:
- Un mark word (incluye bits para GC, monitoreo y hashcode)
- Un class word (referencia comprimida a la clase del objeto)
Hasta ahora, este header ocupa 96 bits (12 bytes), lo cual significa un sobrecoste significativo —sobre todo en aplicaciones con muchos objetos de pequeño tamaño.
¿Qué cambia con Compact Object Headers?
Reducción del header a 64 bits (8 bytes), manteniendo todo lo necesario:
- Mark word
- Class pointer (comprimido a 22 bits)
- Campos reservados para GC y futuros proyectos como Valhalla
El ahorro en memoria puede llegar al 30 % de CPU y 20 % menos uso de heap en aplicaciones que crean muchos objetos pequeños. Benchmarks como SPECjbb2015 muestran mejoras de 22 % en heap y 8 % en CPU, además de menor frecuencia de GC.
Amazon ya lo ha probado en centenas de servicios, validando caídas de hasta 30 % en consumo CPU y 15 % menos GC, especialmente en colectores G1 y Parallel.
¿Cómo habilitarlo?
En Java 25 basta con agregar el siguiente flag al iniciar tu aplicación:
java -XX:+UseCompactObjectHeaders -jar mi-app.jar
Sin necesidad del flag -XX:+UnlockExperimentalVMOptions, ni cambiar una sola línea de código
¿Por qué es relevante?
- Menor consumo de memoria: ideal para microservicios, Kubernetes, contenedores o entornos edge.
- Mejor rendimiento: los objetos más pequeños mejoran la localidad de caché y reducen cargas de GC.
- Implementación sencilla: es transparente y compatible con código existente, sin riesgo ni esfuerzo extra.
Compact Headers es parte de Project Lilliput, cuyo objetivo es reducir drásticamente el overhead de los headers de objetos:
- JDK 22 introdujo estructura para monitores de objetos
- JEP 450 en Java 24 activó Compact Headers en modo experimental
- Ahora, JEP 519 en Java 25 los integra como funcionalidad oficial
Esto también adelanta compatibilidad con futuras mejoras como Valhalla (clases de valor) y Project Panama.
Recomendaciones prácticas
- Activá en entornos de desarrollo o staging y monitorizá el uso de memoria y CPU.
- En entornos de producción, el flag puede reducir costes operativos y mejorar densidad en la nube.
- Revisá que no actives `-XX:-UseCompressedClassPointers` o locking legado, ya obsoletos en Java 25.
- Esperá mejoras similares en plataformas x64 y AArch64; ZGC en x64 aún está en progreso
Java 25 (LTS) ofrece ahora una forma sencilla de optimizar memoria y rendimiento con un solo parámetro. Compact Object Headers representan una mejora tangible para cualquier proyecto moderno que genere muchos objetos. Es una mejora que conviene activar y medir desde ya.
Dejo link:
https://www.infoq.com/news/2025/06/java-25-compact-object-headers/