Lançamento do Java SE 16

Após seis meses de desenvolvimento, a Oracle lançou a plataforma Java SE 16 (Java Platform, Standard Edition 16), cuja implementação de referência é baseada no projeto aberto OpenJDK. O Java SE 16 mantém a compatibilidade retroativa com versões anteriores da plataforma Java, permitindo que todos os projetos Java previamente escritos funcionem sem alterações na nova versão. As versões prontas para instalação do Java SE 16 (JDK, JRE e Server JRE) estão disponíveis para Linux (x86_64, AArch64), Windows e macOS. A implementação de referência do Java 16, desenvolvida no âmbito do projeto OpenJDK, é totalmente aberta sob a licença GPLv2 com exceções do GNU ClassPath, permitindo vinculação dinâmica a produtos comerciais.

O Java SE 16 é classificado como uma versão com ciclo de suporte regular, com atualizações programadas até o próximo lançamento. Para uma versão com suporte de longo prazo (LTS), deve-se usar o Java SE 11, cujas atualizações serão lançadas até 2026. O próximo lançamento LTS está previsto para setembro de 2021. Vale lembrar que, a partir do lançamento do Java 10, o projeto passou a adotar um novo processo de desenvolvimento, que implica em um ciclo mais curto para a criação de novas versões. A nova funcionalidade agora é desenvolvida em um branch master continuamente atualizado, onde mudanças já concluídas são incorporadas e de onde, a cada seis meses, são derivadas branches para estabilização de novas versões.

Na preparação do novo lançamento, o desenvolvimento foi transferido do sistema de controle de versões Mercurial para o Git e a plataforma de colaboração GitHub. Espera-se que essa migração melhore o desempenho das operações com o repositório, aumente a eficiência de armazenamento, garanta acesso a mudanças ao longo de toda a história do projeto, melhore o suporte à revisão de código e utilize a API para automatizar fluxos de trabalho. Além disso, a adoção do Git e do GitHub torna o projeto mais atraente para novatos e desenvolvedores acostumados com o Git.

Entre as novidades do Java 16, podemos destacar:

  • Adicionado um módulo experimental jdk.incubator.vector com a implementação da API Vector, que fornece funções para cálculos vetoriais realizados usando instruções vetoriais dos processadores x86_64 e AArch64, permitindo aplicar operações simultaneamente a vários valores (SIMD). Diferente das capacidades de vetorização automática para operações escalares disponíveis no compilador JIT HotSpot, a nova API permite gerenciar explicitamente a vetorização para processamento paralelo de dados.
  • No código JDK e na VM HotSpot, escrito em C++, agora é permitido utilizar recursos introduzidos na especificação C++14. Anteriormente, era permitido o uso dos padrões C++98/03.
  • No coletor de lixo ZGC (Z Garbage Collector), que opera em modo passivo e minimiza, na medida do possível, as interrupções devido à coleta de lixo, foi adicionada a capacidade de processamento paralelo de pilhas de threads sem pausar a execução das threads do aplicativo. No ZGC, agora restam apenas aqueles que requerem pausar a execução, ocasionando interrupções permanentes, geralmente não superiores a algumas centenas de microssegundos.
  • Adicionada a suporte a soquetes Unix (AF_UNIX) nas classes SocketChannel, ServerSocketChannel e java.nio.channels.
  • Implementado um port para a distribuição Linux Alpine com a biblioteca C padrão musl, que é popular em ambientes de contêineres, microsserviços, sistemas em nuvem e embarcados. O port sugerido para esses ambientes permite executar programas em Java como aplicações comuns. Além disso, através do jlink, é possível remover todos os módulos não utilizados e criar um ambiente mínimo necessário para executar a aplicação, permitindo a criação de imagens compactas específicas para aplicações.
  • Implementado o mecanismo Elastic Metaspace, que otimiza as operações de alocação e liberação de memória ocupada pelos metadados das classes (metaspace) na JVM HotSpot. A aplicação do Elastic Metaspace reduz a fragmentação de memória, diminui a sobrecarga no carregador de classes e também tem um efeito positivo na performance de aplicações server-side de longa duração, graças ao retorno mais rápido à memória do sistema operacional da memória ocupada por metadados de classes não utilizados. Para escolher o modo de liberação de memória após a descarregamento de classes, a opção "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)" foi proposta.
  • Adicionado o port JDK para sistemas Windows operando em hardware com processadores baseados na arquitetura AArch64.
  • Proposto o terceiro pré-release da API Foreign-Memory Access, permitindo que aplicativos Java acessem de forma segura e eficiente áreas de memória fora do heap Java, manipulando novas abstrações MemorySegment, MemoryAddress e MemoryLayout.
  • Implementada a API experimental Foreign Linker, que fornece acesso nativo a código Java. Juntamente com a API Foreign-Memory, essa nova interface facilita significativamente a criação de ligações sobre bibliotecas compartilhadas clássicas.
  • Adicionada a utilidade jpackage, que permite criar pacotes para aplicativos Java autossuficientes. A utilidade é baseada no javapackager do JavaFX e permite gerar pacotes em formatos nativos para diferentes 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.
  • Incluída por padrão a encapsulação rigorosa de todos os elementos internos do JDK, exceto APIs críticas, como sun.misc.Unsafe. O valor da opção '—illegal-access' agora é definido por padrão como 'deny' em vez de 'permit', o que irá bloquear tentativas de acesso de código à maioria das classes, métodos e campos internos. Para contornar a limitação, deve-se usar a opção '—illegal-access=permit'.
  • Estabilizada a implementação de correspondência de padrões no operador 'instanceof', que agora permite definir uma variável local para acessar o valor verificado. Por exemplo, agora é possível escrever 'if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}' sem a necessidade de definir explicitamente 'String s = (String) obj'. Anteriormente: if (obj instanceof Group) { Group group = (Group) obj; var entries = group.getEntries(); } Agora, pode-se omitir a definição 'Group group = (Group) obj': if (obj instanceof Group group) { var entries = group.getEntries(); }
  • Estabilizada a implementação da palavra-chave 'record', que oferece uma forma compacta de definir classes, permitindo evitar a definição explícita de vários métodos de baixo nível, como equals(), hashCode() e toString(), quando os dados são armazenados apenas em campos, e o comportamento trabalhado não muda. Quando as implementações padrão dos métodos equals(), hashCode() e toString() são utilizadas na classe, pode-se dispensar suas definições explícitas: public record BankTransaction(LocalDate date, double amount, String description) {}

    Esta declaração resultará na adição automática das implementações dos métodos equals(), hashCode() e toString() além do construtor e dos métodos que controlam a modificação de dados (getter).

  • Foi proposta uma segunda versão preliminar de classes e interfaces seladas que não podem ser usadas por outras classes e interfaces para herança, extensão ou sobrecarga de implementação. As classes seladas também oferecem um modo mais declarativo de restringir o uso da superclasse, em vez de modificar os modificadores de acesso, baseando-se na enumeração explícita de subclasses permitidas para extensão. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster