Versão Java SE 16

Após seis meses de desenvolvimento, a Oracle lançou o Java SE 16 (Java Platform, Standard Edition 16), que usa o projeto OpenJDK como implementação de referência. Java SE 16 mantém compatibilidade retroativa com versões anteriores da plataforma Java; todos os projetos Java escritos anteriormente funcionarão sem alterações quando lançados na nova versão. Compilações prontas para instalação do Java SE 16 (JDK, JRE e Server JRE) são preparadas para Linux (x86_64, AArch64), Windows e macOS. Desenvolvida pelo projeto OpenJDK, a implementação de referência Java 16 é totalmente open source sob a licença GPLv2, com exceções GNU ClassPath permitindo vinculação dinâmica com produtos comerciais.

O Java SE 16 é classificado como uma versão de suporte geral e continuará recebendo atualizações até a próxima versão. O branch Long Term Support (LTS) deverá ser o Java SE 11, que continuará recebendo atualizações até 2026. O próximo lançamento LTS está agendado para setembro de 2021. Lembramos que a partir do lançamento do Java 10, o projeto passou para um novo processo de desenvolvimento, implicando em um ciclo mais curto para a formação de novos lançamentos. A nova funcionalidade agora é desenvolvida em um branch master constantemente atualizado, que inclui alterações prontas e a partir do qual os branchs são ramificados a cada seis meses para estabilizar novos lançamentos.

Em preparação para a nova versão, o desenvolvimento migrou do sistema de controle de versão Mercurial para o Git e a plataforma de desenvolvimento colaborativo GitHub. Espera-se que a migração melhore o desempenho das operações do repositório, aumente a eficiência do armazenamento, forneça acesso a alterações ao longo do histórico do projeto, melhore o suporte para revisão de código e permita que APIs automatizem fluxos de trabalho. Além disso, o uso do Git e do GitHub torna o projeto mais atrativo para iniciantes e desenvolvedores acostumados com Git.

Os novos recursos do Java 16 incluem:

  • Adicionado módulo experimental jdk.incubator.vector com uma implementação da API Vector, que fornece funções para cálculos vetoriais que são realizados usando instruções vetoriais em processadores x86_64 e AArch64 e permitem que operações sejam aplicadas simultaneamente a vários valores (SIMD). Em contraste com os recursos fornecidos no compilador HotSpot JIT para autovetorização de operações escalares, a nova API permite controlar explicitamente a vetorização para processamento paralelo de dados.
  • O código JDK e VM HotSpot escrito em C++ pode usar recursos introduzidos na especificação C++14. Anteriormente, os padrões C++98/03 eram permitidos.
  • O ZGC (Z Garbage Collector), que opera em modo passivo e minimiza ao máximo os atrasos devido à coleta de lixo, adicionou a capacidade de processar pilhas de threads em paralelo sem pausar os threads do aplicativo. O ZGC agora só possui trabalhos que requerem suspensão, que apresentam atrasos constantes, geralmente não ultrapassando algumas centenas de microssegundos.
  • Adicionado suporte para soquetes Unix (AF_UNIX) às classes SocketChannel, ServerSocketChannel e java.nio.channels.
  • Uma porta foi implementada para a distribuição Linux Alpine com a biblioteca C padrão musl, que é popular em ambientes para contêineres, microsserviços, nuvem e sistemas embarcados. A porta proposta em tais ambientes permite executar programas Java como aplicativos normais. Além disso, usando o jlink, você pode remover todos os módulos não utilizados e criar um ambiente mínimo suficiente para executar o aplicativo, o que permite criar imagens compactas específicas do aplicativo.
  • Foi implementado o mecanismo Elastic Metaspace, otimizando as operações de alocação e retorno de memória ocupada por metadados de classe (metaspace) no JVM HotSpot. O uso do Elastic Metaspace reduz a fragmentação da memória, reduz a sobrecarga do carregador de classes e também tem um efeito benéfico no desempenho de aplicativos de servidor de longa execução devido ao retorno mais rápido da memória ocupada por metadados de classe não utilizados para o sistema operacional. Para selecionar o modo de liberação de memória após descarregar classes, a opção “-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)” é oferecida.
  • Uma porta JDK foi adicionada para sistemas Windows executados em hardware com processadores baseados na arquitetura AArch64.
  • Uma terceira visualização da API de acesso à memória externa foi proposta, permitindo que aplicativos Java acessem regiões de memória fora do heap Java de forma segura e eficiente, manipulando as novas abstrações MemorySegment, MemoryAddress e MemoryLayout.
  • Uma API experimental de Foreign Linker foi implementada, fornecendo acesso de Java ao código nativo. Juntamente com a API Foreign-Memory, a nova interface de programação facilita muito a criação de wrappers em bibliotecas compartilhadas convencionais.
  • Adicionado o utilitário jpackage, que permite criar pacotes para aplicativos Java independentes. O utilitário é baseado no javapackager do JavaFX e permite criar pacotes em formatos nativos para diversas plataformas (msi e exe para Windows, pkg e dmg para macOS, deb e rpm para Linux). Os pacotes incluem todas as dependências necessárias.
  • O encapsulamento estrito de todos os componentes internos do JDK é habilitado por padrão, com exceção de APIs críticas, como sun.misc.Unsafe. O valor da opção “--illegal-access” agora está definido como “deny” em vez de “permit” por padrão, o que bloqueará tentativas de código para acessar a maioria das classes, métodos e campos internos. Para contornar a restrição, use a opção “-illegal-access=permit”.
  • A implementação da correspondência de padrões no operador “instanceof” foi estabilizada, o que permite definir imediatamente uma variável local para se referir ao valor verificado. Por exemplo, você pode escrever imediatamente “if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” sem definir explicitamente “String s = (String) obj”. Foi: if (obj instanceof Group) { Group group = (Group) obj; var entradas = group.getEntries(); } Agora você pode fazer isso sem definir “Group group = (Group) obj”: if (obj instanceof Group group) { var entradas = group.getEntries(); }
  • A implementação da palavra-chave "record" foi estabilizada, fornecendo um formato compacto para definições de classe que elimina a necessidade de definir explicitamente vários métodos de baixo nível, como equals(), hashCode() e toString() em casos onde os dados são armazenados apenas em campos com os quais não muda. Quando uma classe usa implementações padrão dos métodos equals(), hashCode() e toString(), ela pode prescindir de sua definição explícita: public record BankTransaction(LocalDate date, double amount, String description) {}

    Esta declaração adicionará automaticamente implementações dos métodos equals(), hashCode() e toString() além dos métodos construtor e getter.

  • Um segundo rascunho é proposto para classes e interfaces seladas que não podem ser usadas por outras classes e interfaces para herdar, estender ou substituir implementações. As classes seladas também fornecem uma maneira mais declarativa de restringir o uso de uma superclasse do que os modificadores de acesso, com base na lista explícita das subclasses permitidas para extensão. pacote com.example.geometry; classe pública selada Shape permite com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Fonte: opennet.ru

Adicionar um comentário