Apresentando o Java 14 e suas novidades

Na tarde de ontem, 17 de março de 2020 a Oracle anunciou a chegada do Java SE 14, junto de sua implementação Java Development Kit versão 14, vulgo JDK 14.

Nessa matéria vamos apresentar cada um dos 16 aprimoramento entregues nesta versão com um breve resumo teórico para entendimento.

Desde o Java 9 a Oracle vem atualizando o Java SE a cada 6 meses, e entregando uma versão LTS  (Long Term Support) a cada dois anos. Com a chegada do JDK 14, o JDK 13 ficará obsoleto em breve. Outras versões que possuem suporte são os JDK 8 e JDK 11, ambos são LTS.

JEPs entregues no JDK 14

No JDK 14 foram entregues um total de 16 JEPs, apenas para compreensão, JEP é a abreviação de JDK Enhancement Proposals, traduzindo Propostas de aprimoramento do JDK.

Apenas para colocar os pingos nos is, quando é apresentado uma JEP Preview, ela é um novo recurso totalmente especificado, implementado, mas não permanente, podendo ou não se tornar permanente em uma versão futura do Java. Para se tornar permanente ou ser abandonada, depende dos feedbacks da comunidade.

Segue lista com cada aprimoramento e uma breve explicação sobre cada um:

JEP 305: Pattern Matching for instanceof (Preview)

Este JEP aprimora o Pattern Matching para o operador instanceof. Melhora a produtividade do desenvolvedor, eliminando a necessidade de repetição de código, possibilitando um código mais conciso fortemente tipado.

Hoje temos que realizar comparação da seguinte forma:


@Override public boolean equals(Object o) { 
    return (o instanceof CaseInsensitiveString) && 
        ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
}

Com esse aprimoramento, podemos utilizar da forma abaixo:


@Override public boolean equals(Object o) { 
    return (o instanceof CaseInsensitiveString cis) && 
        cis.s.equalsIgnoreCase(s); 
}

JEP 343: Packaging Tool (Incubator)

Possibilita que o desenvolvedor empacote os aplicativos java em imagens nativas para diferentes plataformas, como windows, linux e MacOS. Isso ajuda no tempo de start da aplicação e no consumo inicial de memória.

JEP 345: NUMA-Aware Memory Allocation for G1

Essa feature melhora o desempenho geral do Garbage Collector G1 em sistemas NUMA (Non-Uniform Memory Access).

JEP 349: JFR Event Streaming

Essa feature expõe os dados do JDK Flight Recorder (JFR) para monitoramento contínuo, o que simplifica o acesso aos dados JFR para várias ferramentas e aplicativos.

JEP 352: Non-Volatile Mapped Byte Buffers

Adiciona um modo de mapeamento de arquivo para o JDK ao usar memória não volátil. A natureza persistente da memória não volátil altera várias suposições de persistência e desempenho que podem ser aproveitadas com essa feature .

JEP 358: Helpful NullPointerExceptions

Melhora as mensagens apresentadas em uma exception NullPointerExceptions , descrevendo com precisão qual variável era nula e outras informações úteis. Isso melhorará a produtividade do desenvolvedor e a qualidade de muitas ferramentas de desenvolvimento e depuração.

JEP 359: Records (Preview)

Fornece uma sintaxe compacta para declarar classes que contêm dados superficialmente imutáveis. Superficialmente, esse recurso reduz bastante o códigos repetidos em classes desse tipo, mas, seu objetivo é melhorar a modelagem de dados como dados. Deve ser fácil, claro e conciso declarar agregados de dados nominais superficialmente imutáveis.

JEP 361: Switch Expressions (Standard)

Foi uma feature preview no JDK 12 e 13 e agora é uma feature completa. Permite que o switch seja usado como uma declaração ou expressão. Essa feature simplifica a codificação diária e preparou o caminho para a feature pattern matching ( JEP 305 ), apenas preview nesta versão.

JEP 362: Deprecate the Solaris and SPARC Ports

Este JEP descontínua as portas Solaris e SPARC com a intenção de removê-las em uma release futura.

JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector

O Garbage Collector CMS foi descontinuado há dois anos e o G1, seu sucessor desde o JDK 6, tem sido o GC padrão. Nesse meio tempo vimos a introdução de dois novos Garbage Collectors, ZGC e Shenandoah, enquanto houve muitas melhorias no G1.

JEP 364: ZGC on macOS

ZGC é um Garbage Collector escalável de baixa latência projetado para heaps de todos os tamanhos, não aumentando o tamanho do heap em tempos de pausa. Assim como hoje funciona em ambiente linux, o ZGC foi portado para MacOS.

JEP 365: ZGC on Windows

Assim como explicado anteriormente no JEP 364, o ZGC foi portado também para Windows.

JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination

Descontínua a combinação de algoritmos Parallel Scavenge e Serial Old do Garbage Collector, que raramente são usados, com a intenção de removê-lo em uma versão futura.

JEP 367: Remove the Pack200 Tools and API

Remove as ferramentas pack200 e unpack200, e a API Pack200 do pacote java.util.jar. Essas ferramentas e API foram descontinuadas no JDK 11.

JEP 368: Text Blocks (Second Preview)

Esta é a segunda preview referente a Text Blocks após ter sido incluído no JDK 13 ( JEP 355 ) e a comunidade ter realizado feedbacks sobre a feature. Com os Text Blocks é possível apresentar sequências de strings mais legíveis, evitando concatenações com o símbolo +, além de diminuir a utilização desenfreada de diversas aspas duplas.

Exemplo:

Agora utilizando Text Blocks:

JEP 370: Foreign-Memory Access API (Incubator)

Foi desenvolvida uma API para permitir que programas Java acessem com segurança e eficiência a memória externa fora do heap Java.

Download do JDK 14

Para realizar o download do JDK 14, basta acessar os links abaixo:

JDK 14: https://www.oracle.com/java/technologies/javase-jdk14-downloads.html

OpenJDK 14: https://jdk.java.net/14/

Epilogo

Após toda essa apresentação do Java 14, bora testar essas novas funcionalidades?

Caso queira se capacitar de forma gratuita, em alguns posts passados, preparei alguns sites e canais do Youtube que nos ajudam com isso. acesse os links:

*Canais do YouTube para o(a) desenvolvedor(a) Java estudar gratuitamente;

*Sites para o(a) desenvolvedor(a) Java estudar de graça.

Lançado a versão 20.0.0 da GraalVM

Nessa terça feira dia 18/02/20, a equipe da GraalVM disponibilizou sua versão 20.0.0. Plataforma Poliglota, que compila seus programas em imagens nativas reduzindo drasticamente o tempo de start e o consumo de memória.

O que é a GraalVM?

A GraalVM é uma máquina virtual universal Open Source criada pela Oracle, que executa aplicativos escritos em JavaScript, Python, Ruby, R, linguagens que já rodam na JVM, como Java, Scala, Groovy, Kotlin, Clojure e linguagens baseadas em LLVM, como C e C ++.

A GraalVM remove o isolamento entre linguagens de programação e permite a interoperabilidade em um tempo de execução compartilhado. As imagens podem ser executadas standalone ou nos contextos do OpenJDK, Node.js ou Oracle Database. Essa interoperabilidade permite desenvolver em java e acessar funcionalidades de outras linguagens.

Abaixo, gráficos de tempo de start e utilização inicial de memória das imagens nativas compiladas pela GraalVM. Os programas foram desenvolvidos respectivamente com os frameworks voltados para microserviços Helidon, Micronaut e Quarkus.

Tempo de start de microserviços Java
Memória utilizada inicialmente com microserviços Java

O que mudou nessa nova versão?

A versão 20 aprimora significativamente os builds da GrallVM para plataforma Microsoft. O suporte permanece experimental, no entanto, as compilações realizadas no Windows, agora contêm o “gu”, que é um utilitário funcional para instalar os componentes. A Engine do JavaScript e o Node.js foram incluídas na distribuição voltada para Windows. O engine JavaScript foi atualizada e agora é compatível com Node.js 12.15.0. O toolchain agora é baseado na versão 9.0.0 do interpretador LLVM suportando novas libs.

Mais sobre a GraalVM

A GraalVM foi apresentada pela Oracle no meio de Abril de 2018 e a sua versão 1.0 foi lançada para Linux e Mac. Como dito anteriormente, já há a versão para plataforma windows, mas com suporte experimental.
Na versão atual, a Community Edition GraalVM é baseada no OpenJDK 1.8.0_242 e no OpenJDK 11.0.6. Já a Enterprise Edition é baseado no 1.8.0_241 e 11.0.6 do JDK.

Caso queira saber mais e começar a utilizar, acesse https://www.graalvm.org/