Después de seis meses de desarrollo, Oracle ha publicado la plataforma Java SE 25 (Java Platform, Standard Edition 24), cuya implementación de referencia utiliza el proyecto de código abierto OpenJDK. A excepción de la eliminación de algunas funciones obsoletas, Java SE 25 mantiene la compatibilidad hacia atrás con versiones anteriores de la plataforma Java: la mayoría de los proyectos Java previamente escritos funcionarán sin cambios al ejecutarse bajo la nueva versión. Las versiones listas para instalar de Java SE 25 (JDK, JRE y Server JRE) están disponibles para Linux (x86_64, AArch64), Windows (x86_64) y macOS (x86_64, AArch64). La implementación de referencia de Java SE 25, desarrollada en el marco del proyecto OpenJDK, está completamente abierta bajo la licencia GPLv2 con excepciones de GNU ClassPath, que permiten el enlace dinámico con productos comerciales.
Java SE 25 se clasifica como una versión con soporte extendido, con actualizaciones que se lanzarán hasta 2033 (las actualizaciones públicas estarán disponibles hasta septiembre de 2030). Las ramas de Java SE 17 y 21, que también continúan siendo mantenidas como versiones de soporte a largo plazo (LTS), recibirán actualizaciones hasta 2029 y 2031, respectivamente (las actualizaciones públicas se ofrecerán hasta 2026 y 2028). El soporte extendido para las ramas LTS de Java SE 8 y 11 se extenderá hasta 2030 y 2032.
Entre las novedades propuestas en Java SE 25 (1, 2, 3, 4):
- Se ha añadido una API experimental StableValue para trabajar con objetos que contienen datos inmutables y que son tratados en la JVM como constantes. A tales objetos se les aplican optimizaciones de rendimiento similares a los campos marcados con la palabra clave «final». La API StableValue separa la creación de valores constantes de su inicialización, garantizando que el valor solo se puede inicializar una vez, reduciendo el tiempo de inicio de los programas y permitiendo aplicar optimizaciones de plegado de constantes en el código del usuario, que anteriormente solo se utilizaban en el código interno de JDK. class Application { // Anteriormente: // static final UserService USERS = new UserService(); // Ahora: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- Se ha añadido una API experimental para codificar y decodificar objetos con claves criptográficas, certificados y listas de certificados revocados, utilizando el formato PEM (Pivacy-Enhanced Mail).
- Se ha agregado soporte para valores limitados (Scoped Values), que permiten compartir datos inmutables en hilos y facilitar el intercambio de datos entre sub-hilos (los valores se heredan). Scoped Values se desarrollan para reemplazar el mecanismo de variables locales por hilo (thread-local variables) y son más eficientes al utilizar un gran número de hilos virtuales (miles y millones de hilos). La principal diferencia entre Scoped Values y las variables locales por hilo es que las primeras se escriben una vez, no se pueden modificar posteriormente y permanecen accesibles solo durante la ejecución del hilo.
- Se ha agregado una API para utilizar funciones criptográficas de derivación de clave (KDF, key derivation function), que permiten generar claves adicionales de la longitud necesaria a partir de una clave secreta (por ejemplo, una contraseña) y un conjunto de datos arbitrario.
- Se eliminó el código y los scripts de construcción para el soporte de sistemas x86 de 32 bits. La cancelación del soporte para sistemas x86 de 32 bits ha permitido simplificar la infraestructura para la construcción y prueba del JDK, así como implementar funcionalidades relacionadas con plataformas sin necesidad de crear controladores de fallback para sistemas de 32 bits x86.
- Se ha agregado la posibilidad de usar una única expresión «import module M» para importar todos los paquetes exportados por el módulo especificado. Este cambio simplifica considerablemente la reutilización de bibliotecas modulares, permitiendo conectar bibliotecas y clases sin definir su ubicación en la jerarquía de paquetes. Por ejemplo, especificar «import module java.base» resultará en la importación de todos los 54 paquetes que pertenecen al módulo java.base, que anteriormente tendrían que mencionarse por separado (por ejemplo, «import java.io.*», «import java.util.*», etc.).
- Se ha propuesto una variante compacta de la sintaxis de los programas, que puede ser útil para la enseñanza y el desarrollo de aplicaciones pequeñas. En la forma compacta no se requiere la definición de clases adicionales, se importan automáticamente las API estándar y están disponibles métodos simplificados de entrada/salida. Por ejemplo, la aplicación «Hello, World!» se puede reducir a: void main() { IO.println(«Hello, World!»); }
- Se permite la especificación en los constructores de expresiones antes de la llamada a super(…), utilizada para invocar explícitamente el constructor de la clase padre desde el constructor de la clase derivada, siempre y cuando estas expresiones no se refieran a la instancia creada por el constructor. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Se ha añadido un modo generativo de operación para el recolector de basura Shenandoah, en el que se procesan por separado los objetos antiguos y los recién creados para mejorar la eficiencia de la limpieza de objetos con un ciclo de vida corto. Este nuevo modo proporciona un rendimiento más predecible, resiliencia a cambios de carga y reducción del consumo de memoria durante la recolección de basura. El programador de Shenandoah tiene como objetivo reducir el tiempo de pausas durante la recolección de basura al realizar una mayor cantidad de trabajo en paralelo con la ejecución de aplicaciones Java.
- Se ha simplificado la creación de un caché para la carga y vinculación anticipadas (Ahead-of-Time) de clases, lo que permite acelerar el arranque de la JVM HotSpot al involucrar clases en un estado ya cargado y vinculado. Al iniciar, ya no se requieren operaciones separadas para registrar la actividad y crear el caché; es suficiente con un solo comando: java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.App …
- Al iniciar la VM de HotSpot Java, se ha implementado la posibilidad de utilizar perfiles de ejecución de métodos obtenidos en una ejecución anterior de la aplicación. Este cambio permite al compilador JIT generar código nativo de inmediato sin la necesidad de acumular estadísticas y sin esperar a que se forme un perfil.
- Se ha implementado el soporte para encabezados de objetos compactos en HotSpot JVM, cuyo tamaño en sistemas de 64 bits se ha reducido de 96 a 64 bits (de 12 a 8 bytes). La reducción del tamaño de los encabezados permite disminuir el tamaño del heap y mejorar la eficiencia del caché.
- Se ha propuesto una implementación de prueba de la API Vector, que proporciona funciones para cálculos vectoriales que se realizan utilizando instrucciones vectoriales de los procesadores x86_64 y AArch64, permitiendo aplicar operaciones simultáneamente a múltiples valores (SIMD). A diferencia de las capacidades de autovectorización de las operaciones escalares proporcionadas por el compilador JIT HotSpot, la nueva API permite controlar explícitamente la vectorización para el procesamiento paralelo de datos.
- Se ha propuesto para prueba la quinta versión preliminar de la API para concurrencia estructurada (Structured Concurrency), que simplifica el desarrollo de aplicaciones multihilo al manejar varias tareas ejecutadas en diferentes hilos como un único bloque.
- En el mecanismo de coincidencia de patrones, se ha propuesto la tercera versión preliminar de la posibilidad de usar tipos primitivos (int, byte, char y otros tipos básicos que no son objetos) en todos los tipos de plantillas, en el operador 'instanceof' y en los bloques 'switch'. switch (x.getStatus()) { case 0 -> 'okay'; case 1 -> 'warning'; case 2 -> 'error'; case int i -> 'unknown status: ' + i; } if (i instanceof byte b) { … b … }
- En JDK Flight Recorder (JFR) se ha añadido soporte experimental para el perfilado con un seguimiento más preciso del consumo de recursos de CPU en la plataforma Linux. La información sobre el tiempo de ejecución de diversas construcciones puede visualizarse claramente utilizando diagramas de color 'FlameGraph'.
- Se ha mejorado la estabilidad de JDK Flight Recorder (JFR) durante el muestreo asíncrono de pilas de hilos de Java al recorrer la pila de llamadas solo en 'puntos seguros' (safepoints).
- En JDK Flight Recorder (JFR) se han añadido herramientas de trazado y evaluación del tiempo de ejecución de métodos. Se admite el trazado de la pila de llamadas de métodos específicos y el registro de estadísticas precisas sobre las llamadas a métodos, abarcando métricas como el tiempo de ejecución y el número de llamadas.
Fuente: opennet.ru
