Após seis meses de desenvolvimento, a Oracle lançou a plataforma Java SE 27 (Java Platform, Standard Edition 27), cujo projeto de referência é o OpenJDK. Com exceção da remoção de algumas funcionalidades obsoletas, a compatibilidade retroativa com versões anteriores da plataforma Java foi mantida no Java SE 27— a maioria dos projetos Java anteriormente escritos funcionará sem alterações ao serem executados na nova versão. Compilações prontas para instalação do Java SE 27 (JDK, JRE e Server JRE) estão preparadas para Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). A implementação de referência do Java SE 27, desenvolvida dentro do projeto OpenJDK, é completamente aberta sob a licença GPLv2 com exceções do GNU ClassPath, permitindo a vinculação dinâmica a produtos comerciais.
O Java SE 27 é classificado como uma versão com ciclo de suporte regular, e atualizações serão lançadas até o próximo lançamento. Para uma ramificação com suporte prolongado (LTS), devem ser usadas as versões Java SE 25, Java SE 21 ou Java SE 17, cujas atualizações serão lançadas até 2033, 2031 e 2029, respectivamente (versões públicas até setembro de 2030, 2028 e 2026). O suporte estendido da ramificação LTS do Java SE 8 continuará até 2030, enquanto o Java SE 11 continuará até 2032.
Entre as mudanças no Java SE 27 (1, 2, 3, 4):
- Por padrão, o coletor de lixo G1 (Garbage-First) é usado para todos os ambientes, que anteriormente era aplicado a sistemas de servidor. O G1 é otimizado para uso em sistemas multiprocessados com grande volume de memória e para equilibrar entre previsibilidade de latências e alta taxa de transferência. Durante a operação, o G1 divide a memória em diversas pequenas regiões e prioriza a limpeza das regiões onde há mais objetos não utilizados e menos dados ativamente utilizados.
- No HotSpot JVM, os cabeçalhos compactos dos objetos são utilizados por padrão. O tamanho dos cabeçalhos em sistemas de 64 bits foi reduzido de 96 para 64 bits, o que diminuiu o consumo de memória e aumentou a probabilidade de dados serem armazenados no cache do processador. Em testes SPECjbb2015, o consumo de memória diminuiu em 22%, a carga do CPU reduziu em 8%, e o número de operações de coleta de lixo diminuiu em 15%. Nos testes do parser JSON, o tempo de execução dos testes foi reduzido em 10%.
- A implementação do TLS 1.3 incluiu suporte a esquemas híbridos de negociação de chaves, combinando o algoritmo ML-KEM (CRYSTALS-Kyber), resistente a ataques de computadores quânticos, com algoritmos clássicos baseados em curvas elípticas ECDHE: X25519MLKEM768 (ECDHE com a curva X25519 + ML-KEM-768), SecP256r1MLKEM76 (ECDHE com a curva secp256r1 + ML-KEM-768) e SecP384r1MLKEM1024 (ECDHE com a curva secp384r1 + ML-KEM-1024). No API javax.net.ssl Esses esquemas estão incluídos por padrão e não requerem alterações nos aplicativos para serem utilizados.
- No conjunto de ferramentas JDK Flight Recorder (JFR), utilizado para monitoramento, profilação e diagnóstico de desempenho, foi adicionado suporte para limpeza nas informações diagnósticas armazenadas, nos argumentos da linha de comando, valores iniciais de variáveis de ambiente e propriedades do sistema. Essa mudança ajuda a prevenir a vazamento de dados sensíveis processados pelo processo em perfil, tais como tokens de autorização e chaves de acesso à API passados por variáveis de ambiente.
- Foi implementada a terceira revisão preliminar da API Lazy Constants para trabalhar com objetos que contêm dados imutáveis e são tratados na JVM como constantes. A esses objetos são aplicadas otimizações de desempenho semelhantes às de campos com a palavra-chave 'final'. Ao contrário dos campos 'final', a nova API separa a criação de valores constantes de sua inicialização, garantindo que o valor possa ser inicializado apenas uma vez, reduzindo o tempo de inicialização dos programas e permitindo otimizações de redução de constantes (constant-folding) no código do usuário, que antes eram utilizadas apenas no código interno do JDK. class Application { // Antes: // static final UserService USERS = new UserService(); // Agora é possível: static final StableValue USERS = StableValue.of(); public static UserService users() { return USERS.orElseSet(UserService::new); } }
- No mecanismo de correspondência de padrões, foi proposta uma quinta versão preliminar para permitir o uso de tipos primitivos (int, byte, char e outros tipos básicos que não são objetos) em todos os tipos de padrões, na operação 'instanceof' e em blocos 'switch'. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { … b … }
- Proposto para teste a sétima versão preliminar da API para concorrência estruturada (Structured Concurrency), simplificando o desenvolvimento de aplicativos multithreaded ao tratar várias tarefas, executadas em diferentes threads, como um bloco único.
- Implementada a décima segunda versão de teste da API Vector, que fornece funções para cálculos vetoriais, executados utilizando instruções vetoriais de processadores x86_64 e AArch64, permitindo aplicar operações simultaneamente a vários valores (SIMD). Ao contrário das capacidades de auto-vetorização de operações escalares oferecidas pelo compilador JIT HotSpot, a nova API permite controle explícito sobre a vetorização para processamento paralelo de dados.
- Disponível a terceira versão preliminar da API para codificação e decodificação de objetos com chaves criptográficas, certificados e listas de certificados revogados, utilizando o formato PEM (Privacy-Enhanced Mail).
Além disso, vale mencionar a publicação da atualização da plataforma para criação de aplicações com interface gráfica JavaFX 27. Nas próximas horas, também se espera o lançamento da máquina virtual universal GraalVM 27, que suporta a execução de aplicações em JavaScript (Node.js), Python, Ruby, R, quaisquer linguagens para JVM (Java, Scala, Clojure, Kotlin) e linguagens para as quais o código de bits LLVM pode ser gerado (C, C++, Rust).
Fonte: opennet.ru
