JDK 12: las nuevas funciones de Java 12

La versión de producción de Java Development Kit 12, basada en Java SE (Standard Edition) 12, ya está disponible. Las compilaciones de JDK 12 están disponibles en Oracle para Linux, Windows y MacOS. 

Dónde descargar JDK 12

Puede descargar el JDK 12 desde el sitio web Java.net.

Las compilaciones de código abierto se proporcionan bajo la Licencia Pública General GNU v2, con Classpath Exception. Las compilaciones comerciales de JDK 12 de Oracle se pueden encontrar en la red de tecnología Oracle con una licencia de código no abierto.

Nuevas funciones en Java 12

Recolector de basura shenandoah

Java 12 agrega Shenandoah, un algoritmo experimental de recolección de basura, para reducir los tiempos de pausa de recolección de basura al realizar el trabajo de evacuación al mismo tiempo que se ejecutan los subprocesos de Java. Shenandoah proporciona un algoritmo apropiado para aplicaciones que valoran la capacidad de respuesta y las pausas breves predecibles. Sin embargo, la intención no es solucionar todos los problemas de pausa de JVM.

Red Hat actualmente admite Shenandoah en las arquitecturas Aarch64 y AMD64.

Colecciones mixtas cancelables para el recolector de basura G1

Java 12 hace que las colecciones mixtas G1 sean abortables si pueden superar el objetivo de pausa. Un objetivo de G1 era cumplir con un objetivo de tiempo de pausa proporcionado por el usuario para sus pausas de recopilación.

Anteriormente, un motor de análisis avanzado seleccionaba la cantidad de trabajo a realizar durante una recopilación. El resultado fue un conjunto de regiones conocido como conjunto de recopilación. Una vez que se determinó el conjunto y se inició la recolección, G1 recopiló todos los objetos vivos en las regiones de las colecciones en todas las regiones sin detenerse. Pero esto podría llevar a que G1 exceda el objetivo de tiempo de pausa si la heurística de una aplicación elige un conjunto de recopilación demasiado grande.

Se necesitaba un mecanismo para detectar cuándo la heurística seleccionaba repetidamente una cantidad incorrecta de trabajo para las colecciones y, si esto sucedía, hacer que G1 realizara el trabajo de colección de forma incremental en pasos, donde la colección podría abortarse después de cada paso. El mecanismo introducido en Java 12 permite a G1 cumplir con el objetivo de tiempo de pausa con más frecuencia.

Devolución rápida de la memoria comprometida no utilizada

Java 12 mejora G1 para devolver automáticamente la memoria del montón de Java al sistema operativo cuando está inactivo. Esta memoria se libera en un período de tiempo razonable cuando la actividad de la aplicación es muy baja.

Anteriormente, G1 solo devolvía memoria del montón en una recolección de basura completa o durante un ciclo concurrente. Con G1 tratando de evitar la recolección de basura completa, solo activando un ciclo concurrente basado en la ocupación del montón y la actividad de asignación, no devolvería la memoria del montón en muchos casos a menos que se vea forzado a hacerlo externamente. Este comportamiento fue desventajoso en entornos de contenedores donde los recursos se pagan por uso. Incluso cuando la JVM usa solo una fracción de su memoria asignada debido a la inactividad, G1 retuvo el montón completo. Por lo tanto, los clientes pagaban por todos los recursos todo el tiempo y los proveedores de la nube no podían hacer un uso completo de su hardware.

Con Java 12, la JVM puede detectar fases de subutilización del montón y reducir automáticamente su uso durante ese tiempo. 

API de constantes JVM

Esta API modela descripciones nominales de archivos de clase de clave y artefactos en tiempo de ejecución, particularmente constantes cargables desde el grupo de constantes. Java 12 define una familia de tipos de referencias simbólicas basadas en valores en un nuevo paquete java.lang.invoke.constant, para describir cada tipo de constante cargable.

Existen grupos de constantes en cada clase de Java, que almacenan operandos e instrucciones de código de bytes en la clase. Las entradas en el grupo de constantes describen artefactos en tiempo de ejecución, como clases y métodos, o valores simples, como cadenas y números enteros. Estas entradas se conocen como constantes cargables.

Los programas que manipulan archivos de clases deben modelar instrucciones de código de bytes y, a su vez, constantes cargables. Pero el uso de tipos estándar de Java para modelar constantes cargables es inadecuado. Esto puede ser aceptable para una constante cargable que describe una cadena, pero es problemático para una constante cargable que describe una clase, porque la producción de un Classobjeto "en vivo" depende de la corrección y consistencia de la carga de clases. La carga de clases, sin embargo, tiene muchas dependencias ambientales y modos de falla.

Por lo tanto, los programas que se ocupan de constantes cargables podrían simplificarse si pudieran manipular clases y métodos y artefactos menos conocidos como identificadores de métodos y constantes calculadas dinámicamente en una forma simbólica nominal. Por lo tanto, la API de constantes de JVM proporciona a las bibliotecas y herramientas una forma única y estándar de describir las constantes cargables.

Inicio mejorado, CDS y recolección de basura

Java 12 mejora el proceso de compilación de JDK para generar un archivo de intercambio de datos de clase (CDS) predeterminado, utilizando la lista de clases predeterminada, en plataformas de 64 bits. Esto mejora el tiempo de inicio listo para usar y elimina la necesidad de ejecutar -Xshare:dumppara beneficiarse del CDS. El proceso de compilación de JDK se ha modificado para que se ejecute java-xshare:dumpdespués de vincular la imagen.

Se han incluido opciones de línea de comandos adicionales para ajustar los tiempos de almacenamiento dinámico de recolección de basura para mejorar el diseño de la memoria para casos comunes. Los usuarios con requisitos más avanzados, como listas de clases personalizadas que incluyen clases de aplicaciones y diferentes configuraciones de recolección de basura, aún pueden crear un archivo CDS personalizado.

Número reducido de puertos ARM

Java 12 elimina todas las fuentes relacionadas con el arm64puerto conservando ARM de 32 bits y 64 bits aarch64. La eliminación de este puerto permitiría a los colaboradores concentrar sus esfuerzos en una sola implementación ARM de 64 bits y eliminar el trabajo duplicado que resultaría de mantener dos puertos. Actualmente, hay dos puertos ARM de 64 bits en el JDK.

Cambiar expresiones

Las expresiones de cambio simplifican la codificación al extender la switchdeclaración para que pueda usarse como una declaración o una expresión. Esto permite que tanto las declaraciones como las expresiones utilicen un alcance "tradicional" o "simplificado" y controlen el comportamiento del flujo. Estos cambios dan como resultado una codificación "cotidiana" más simple y preparan el camino para el uso de la coincidencia de patrones en switch.

A medida que los constructores de Java avanzan para admitir la coincidencia de patrones, las irregularidades de la switchdeclaración de Java se  han convertido en impedimentos. Estos incluyen el comportamiento de flujo de control predeterminado de los bloques de interruptores; alcance predeterminado de bloques de interruptores, en los que el bloque se trata como un solo alcance y cambiar funcionando solo como una declaración. El diseño actual de la switchdeclaración de Java sigue de cerca lenguajes como C ++ y, de forma predeterminada, admite la semántica fallida. Este flujo de control ha sido útil para escribir código de bajo nivel. Pero cuando el interruptor se usa en contextos de nivel superior, su naturaleza propensa a errores comienza a pesar más que la flexibilidad.

Suite de referencia básica

JDK 12 incluye un conjunto básico de microbenchmarks, que se han agregado al código fuente de la plataforma. El objetivo es facilitar a los desarrolladores la ejecución de pruebas comparativas existentes o la creación de nuevas.

La propuesta de la suite de microbenchmarks, creada en julio de 2014 y actualizada a principios de noviembre de 2018, se basó en Java Microbenchmark Harness (JMH), para la creación de pruebas de referencia escritas en Java y otros lenguajes JVM. La suite está ubicada con el código fuente JDK en un solo directorio, y los desarrolladores pueden agregar fácilmente nuevos puntos de referencia.

No era un objetivo proporcionar puntos de referencia para las nuevas funciones de JDK o crear un conjunto completo de puntos de referencia que cubrieran todo en el JDK. También tenga en cuenta que la suite de evaluación comparativa no es necesaria para las compilaciones JDK normales, pero es un objetivo de compilación independiente. 

La propuesta pedía la creación de una nueva página en wiki.openjdk.java.net para explicar cómo desarrollar puntos de referencia y describir los requisitos. Estos requisitos exigirán el cumplimiento de los estándares de codificación, el rendimiento reproducible y la documentación.

Actualizaciones de JDK 12

Los planes requieren que JDK 12 reciba dos actualizaciones antes de ser reemplazado por JDK 13 en seis meses. JDK 12 es parte de la cadencia de lanzamiento de seis meses de Oracle que se presentó con JDK 9 en septiembre de 2017. JDK 12 se caracteriza por ser un lanzamiento de funciones, a diferencia del JDK 11, que es un lanzamiento de soporte a largo plazo con varios años de soporte planeados.