Versión de Java SE 16

Despois de seis meses de desenvolvemento, Oracle lanzou Java SE 16 (Java Platform, Standard Edition 16), que usa o proxecto OpenJDK como implementación de referencia. Java SE 16 mantén a compatibilidade con versións anteriores da plataforma Java; todos os proxectos Java escritos anteriormente funcionarán sen cambios cando se lancen baixo a nova versión. As compilacións listas para instalar de Java SE 16 (JDK, JRE e Server JRE) están preparadas para Linux (x86_64, AArch64), Windows e macOS. Desenvolvida polo proxecto OpenJDK, a implementación de referencia de Java 16 é totalmente de código aberto baixo a licenza GPLv2, con excepcións de GNU ClassPath que permiten ligazóns dinámicas con produtos comerciais.

Java SE 16 está clasificado como versión de soporte xeral e seguirá recibindo actualizacións ata a próxima versión. A rama de Soporte a longo prazo (LTS) debería ser Java SE 11, que seguirá recibindo actualizacións ata 2026. O próximo lanzamento de LTS está programado para setembro de 2021. Lembrámosvos que a partir do lanzamento de Java 10, o proxecto pasou a un novo proceso de desenvolvemento, o que implica un ciclo máis curto para a formación de novos lanzamentos. Agora desenvólvese unha nova funcionalidade nunha rama mestra que se actualiza constantemente, que inclúe cambios xa feitos e desde a que se ramifican cada seis meses para estabilizar as novas versións.

En preparación para a nova versión, o desenvolvemento pasou do sistema de control de versións de Mercurial a Git e á plataforma de desenvolvemento colaborativo GitHub. Espérase que a migración mellore o rendemento das operacións do repositorio, aumente a eficiencia do almacenamento, proporcione acceso aos cambios ao longo do historial do proxecto, mellore a compatibilidade coa revisión de código e permita que as API automaticen os fluxos de traballo. Ademais, o uso de Git e GitHub fai que o proxecto sexa máis atractivo para principiantes e desenvolvedores afeitos a Git.

As novas funcións de Java 16 inclúen:

  • Engadiuse o módulo experimental jdk.incubator.vector cunha implementación da API Vector, que proporciona funcións para cálculos vectoriais que se realizan mediante instrucións vectoriais en procesadores x86_64 e AArch64 e permiten aplicar operacións simultáneamente a varios valores (SIMD). En contraste coas capacidades proporcionadas no compilador HotSpot JIT para a vectorización automática de operacións escalares, a nova API permítelle controlar explícitamente a vectorización para o procesamento de datos paralelo.
  • O código JDK e VM HotSpot escrito en C++ pode utilizar as funcións introducidas na especificación C++14. Anteriormente, permitíanse os estándares C++98/03.
  • O ZGC (Z Garbage Collector), que funciona en modo pasivo e minimiza os atrasos debido á recollida de lixo na medida do posible, engadiu a posibilidade de procesar pilas de fíos en paralelo sen pausar fíos de aplicación. O ZGC agora só ten traballos que requiren suspensión, que ten atrasos constantes, que normalmente non superan uns centos de microsegundos.
  • Engadido soporte para sockets Unix (AF_UNIX) ás clases SocketChannel, ServerSocketChannel e java.nio.channels.
  • Implementouse un porto para a distribución de Linux Alpine coa biblioteca C estándar musl, que é popular en ambientes para contedores, microservizos, nube e sistemas integrados. O porto proposto nestes ambientes permítelle executar programas Java como aplicacións habituais. Ademais, usando jlink, pode eliminar todos os módulos non utilizados e crear un ambiente mínimo suficiente para executar a aplicación, o que lle permite crear imaxes compactas específicas da aplicación.
  • Implementouse o mecanismo Elastic Metaspace, optimizando as operacións de asignación e devolución de memoria ocupada polos metadatos de clase (metaespazo) en JVM HotSpot. O uso de Elastic Metaspace reduce a fragmentación da memoria, reduce a sobrecarga do cargador de clases e tamén ten un efecto beneficioso sobre o rendemento das aplicacións de servidor de longa duración debido ao retorno máis rápido da memoria ocupada polos metadatos de clases non utilizados ao sistema operativo. Para seleccionar o modo de liberación da memoria despois de descargar as clases, ofrécese a opción "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)".
  • Engadiuse un porto JDK para sistemas Windows que se executan en hardware con procesadores baseados na arquitectura AArch64.
  • Propúxose unha terceira vista previa da API de acceso á memoria estranxeira, que permite ás aplicacións Java acceder de forma segura e eficiente a rexións de memoria fóra do montón de Java manipulando as novas abstraccións MemorySegment, MemoryAddress e MemoryLayout.
  • Implementouse unha API experimental de Foreign Linker, que proporciona acceso desde Java ao código nativo. Xunto coa API de memoria estranxeira, a nova interface de programación facilita moito a creación de envoltorios sobre as bibliotecas compartidas convencionais.
  • Engadida a utilidade jpackage, que lle permite crear paquetes para aplicacións Java autónomos. A utilidade baséase en javapackager de JavaFX e permite crear paquetes en formatos propios de varias plataformas (msi e exe para Windows, pkg e dmg para macOS, deb e rpm para Linux). Os paquetes inclúen todas as dependencias necesarias.
  • A encapsulación estrita de todos os elementos internos de JDK está habilitada por defecto, a excepción das API críticas como sun.misc.Unsafe. O valor da opción "--illegal-access" agora está definido como "negar" en lugar de "permitir" por defecto, o que bloqueará os intentos do código para acceder á maioría das clases, métodos e campos internos. Para evitar a restrición, use a opción "-illegal-access=permit".
  • Estabilizouse a implementación da coincidencia de patróns no operador "instanceof", o que lle permite definir inmediatamente unha variable local para referirse ao valor marcado. Por exemplo, pode escribir inmediatamente "se (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}" sen definir explícitamente "String s = (String) obj". Was: if (obj instanceof Group) { Group group = (Group) obj; entradas var = group.getEntries(); } Agora podes prescindir de definir “Group group = (Group) obj”: if (obj instanceof Group group) { var entries = group.getEntries(); }
  • Estabilizouse a implementación da palabra clave "record", proporcionando unha forma compacta para as definicións de clases que elimina a necesidade de definir explícitamente varios métodos de baixo nivel como equals(), hashCode() e toString() nos casos en que se almacenan datos. só en campos.co que non cambia. Cando unha clase usa implementacións estándar dos métodos equals(), hashCode() e toString(), pode prescindir da súa definición explícita: rexistro público Transacción bancaria (data LocalDate, importe dobre, descrición da cadea) {}

    Esta declaración engadirá automaticamente implementacións dos métodos equals(), hashCode() e toString() ademais dos métodos construtor e getter.

  • Proponse un segundo borrador para as clases e interfaces seladas que non poden ser usadas por outras clases e interfaces para herdar, estender ou anular implementacións. As clases seladas tamén proporcionan un xeito máis declarativo de restrinxir o uso dunha superclase que os modificadores de acceso, baseándose na lista explícita das subclases permitidas para a extensión. paquete com.example.xeometry; clase pública selada Permisos de forma com.example.polar.Circle, com.example.quad.Rectángulo, com.example.quad.simple.Square {…}

Fonte: opennet.ru

Engadir un comentario