Lanzamiento de Java SE 16

Después de seis meses de desarrollo, Oracle lanzó Java SE 16 (Java Platform, Standard Edition 16), que utiliza el proyecto de código abierto OpenJDK como implementación de referencia. Java SE 16 mantiene la compatibilidad con versiones anteriores de la plataforma Java; todos los proyectos Java escritos anteriormente funcionarán sin cambios cuando se lancen con la nueva versión. Las compilaciones listas para instalar de Java SE 16 (JDK, JRE y Server JRE) están preparadas para Linux (x86_64, AArch64), Windows y macOS. Desarrollada por el proyecto OpenJDK, la implementación de referencia de Java 16 es completamente de código abierto bajo la licencia GPLv2, con excepciones GNU ClassPath que permiten enlaces dinámicos con productos comerciales.

Java SE 16 está clasificado como una versión de soporte general y seguirá recibiendo actualizaciones hasta la próxima versión. La rama de soporte a largo plazo (LTS) debería ser Java SE 11, que seguirá recibiendo actualizaciones hasta 2026. El próximo lanzamiento de LTS está previsto para septiembre de 2021. Le recordamos que a partir del lanzamiento de Java 10, el proyecto pasó a un nuevo proceso de desarrollo, lo que implica un ciclo más corto para la formación de nuevas versiones. Ahora se desarrolla nueva funcionalidad en una rama maestra constantemente actualizada, que incluye cambios ya hechos y desde la cual las ramas se ramifican cada seis meses para estabilizar las nuevas versiones.

En preparación para la nueva versión, el desarrollo pasó del sistema de control de versiones Mercurial a Git y la plataforma de desarrollo colaborativo GitHub. Se espera que la migración mejore el rendimiento de las operaciones del repositorio, aumente la eficiencia del almacenamiento, proporcione acceso a los cambios a lo largo del historial del proyecto, mejore el soporte para la revisión de código y habilite las API para automatizar los flujos de trabajo. Además, el uso de Git y GitHub hace que el proyecto sea más atractivo para principiantes y desarrolladores acostumbrados a Git.

Las nuevas características de Java 16 incluyen:

  • Se agregó el módulo experimental jdk.incubator.vector con una implementación de Vector API, que proporciona funciones para cálculos vectoriales que se realizan utilizando instrucciones vectoriales en procesadores x86_64 y AArch64 y permite que las operaciones se apliquen simultáneamente a múltiples valores (SIMD). A diferencia de las capacidades proporcionadas en el compilador HotSpot JIT para la vectorización automática de operaciones escalares, la nueva API le permite controlar explícitamente la vectorización para el procesamiento de datos en paralelo.
  • El código JDK y VM HotSpot escrito en C++ puede utilizar funciones introducidas en la especificación C++14. Anteriormente, se permitían los estándares C++98/03.
  • El ZGC (Z Garbage Collector), que opera en modo pasivo y minimiza los retrasos debido a la recolección de basura tanto como sea posible, ha agregado la capacidad de procesar pilas de subprocesos en paralelo sin pausar los subprocesos de la aplicación. El ZGC ahora sólo tiene trabajos que requieren suspensión, lo que tiene retrasos constantes, que generalmente no superan unos pocos cientos de microsegundos.
  • Se agregó soporte para sockets Unix (AF_UNIX) a las clases SocketChannel, ServerSocketChannel y java.nio.channels.
  • Se ha implementado un port para la distribución de Linux Alpine con la biblioteca C estándar musl, que es popular en entornos de contenedores, microservicios, nube y sistemas integrados. El puerto propuesto en dichos entornos le permite ejecutar programas Java como aplicaciones normales. Además, utilizando jlink, puede eliminar todos los módulos no utilizados y crear un entorno mínimo suficiente para ejecutar la aplicación, lo que le permite crear imágenes compactas específicas de la aplicación.
  • Se ha implementado el mecanismo Elastic Metaspace, optimizando las operaciones de asignación y devolución de memoria ocupada por metadatos de clase (metaespacio) en JVM HotSpot. El uso de Elastic Metaspace reduce la fragmentación de la memoria, reduce la sobrecarga del cargador de clases y también tiene un efecto beneficioso en el rendimiento de las aplicaciones de servidor de larga ejecución debido al retorno más rápido de la memoria ocupada por los metadatos de clases no utilizados al sistema operativo. Para seleccionar el modo de liberación de memoria después de descargar las clases, se ofrece la opción “-XX:MetaspaceReclaimPolicy=(balanced|agressive|none)”.
  • Se ha agregado un puerto JDK para sistemas Windows que se ejecutan en hardware con procesadores basados ​​en la arquitectura AArch64.
  • Se ha propuesto una tercera vista previa de la API de acceso a memoria externa, que permite a las aplicaciones Java acceder de forma segura y eficiente a regiones de memoria fuera del montón de Java mediante la manipulación de las nuevas abstracciones MemorySegment, MemoryAddress y MemoryLayout.
  • Se ha implementado una API de enlace externo experimental que proporciona acceso desde Java al código nativo. Junto con la API Foreign-Memory, la nueva interfaz de programación hace que sea mucho más fácil crear contenedores sobre bibliotecas compartidas convencionales.
  • Se agregó la utilidad jpackage, que le permite crear paquetes para aplicaciones Java independientes. La utilidad se basa en javapackager de JavaFX y le permite crear paquetes en formatos nativos de varias plataformas (msi y exe para Windows, pkg y dmg para macOS, deb y rpm para Linux). Los paquetes incluyen todas las dependencias necesarias.
  • La encapsulación estricta de todos los componentes internos del JDK está habilitada de forma predeterminada, con la excepción de las API críticas como sun.misc.Unsafe. El valor de la opción “--illegal-access” ahora está configurado en “denegar” en lugar de “permitir” de forma predeterminada, lo que bloqueará los intentos del código de acceder a la mayoría de las clases, métodos y campos internos. Para evitar la restricción, utilice la opción “-illegal-access=permit”.
  • Se ha estabilizado la implementación de la coincidencia de patrones en el operador "instancia de", lo que le permite definir inmediatamente una variable local para hacer referencia al valor verificado. Por ejemplo, puede escribir inmediatamente "if (obj instancia de String s && s.length() > 5) {.. s.contains(..) ..}" sin definir explícitamente "String s = (String) obj". Era: if (obj instancia de Grupo) { Grupo grupo = (Grupo) obj; var entradas = group.getEntries(); } Ahora puedes prescindir de definir “Grupo grupo = (Grupo) obj”: if (obj instancia de Grupo grupo) { var entradas = grupo.getEntries(); }
  • La implementación de la palabra clave "record" se ha estabilizado, proporcionando una forma compacta para las definiciones de clases que elimina la necesidad de definir explícitamente varios métodos de bajo nivel como equals(), hashCode() y toString() en los casos en que se almacenan datos. solo en campos con los que no cambia. Cuando una clase utiliza implementaciones estándar de los métodos equals(), hashCode() y toString(), puede prescindir de su definición explícita: registro público BankTransaction(Fecha LocalDate, monto doble, descripción de cadena) {}

    Esta declaración agregará automáticamente implementaciones de los métodos equals(), hashCode() y toString() además de los métodos constructor y getter.

  • Se propone un segundo borrador para clases e interfaces selladas que no pueden ser utilizadas por otras clases e interfaces para heredar, ampliar o anular implementaciones. Las clases selladas también proporcionan una forma más declarativa de restringir el uso de una superclase que los modificadores de acceso, basándose en una lista explícita de las subclases permitidas para la extensión. paquete com.ejemplo.geometría; clase pública sellada La forma permite com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Fuente: opennet.ru

Añadir un comentario