JDK 27: O que muda de verdade no seu Java em setembro de 2026
O JDK 27 entrou oficialmente no Rampdown Phase One em 04 de junho de 2026, o que significa que o feature set está congelado. Nenhuma nova JEP entra mais nessa release. O GA está marcado para 14 de setembro de 2026.
Antes de mergulhar nas features, um ponto importante:
JDK 27 não é LTS. O ciclo atual define uma nova LTS a cada 2 anos. A última foi o JDK 25 (setembro/2025). A próxima será o JDK 29 (setembro/2027). O JDK 27 tem suporte de 6 meses, assim como o JDK 26.
Se você usa Java em produção com política de LTS, o JDK 27 é para você acompanhar as features que vão consolidar no 29. Mas vale entender agora, especialmente uma delas que vira default sem você mudar uma linha de código.
As JEPs do JDK 27
| JEP | Feature | Status |
|---|---|---|
| 523 | G1 como GC padrão em todos os ambientes | Final |
| 527 | Post-Quantum Hybrid Key Exchange para TLS 1.3 | Final |
| 531 | Lazy Constants | 3ª Preview |
| 532 | Primitive Types in Patterns, instanceof e switch | 5ª Preview |
| 533 | Structured Concurrency | 7ª Preview |
| 534 | Compact Object Headers por padrão | Final |
| 537 | Vector API | 12ª Incubação |
Três delas merecem atenção especial para o dia a dia de um dev Java.
1. Compact Object Headers por Default - JEP 534
Essa é a feature mais impactante do JDK 27 para quem roda aplicações em produção.
O que é
Todo objeto Java na JVM tem um header com metadados: referência para a classe, identity hash code e informações de lock. Nas versões anteriores, esse header ocupa 96 bits (12 bytes) em arquiteturas 64-bit.
O JEP 534 muda o layout padrão para compact object headers, reduzindo de 96 bits para 64 bits (8 bytes), uma redução de 33% no tamanho do header de cada objeto.
Por que isso importa
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Objeto simples com 2 campos int&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;class&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-title class_&amp;quot;&lt;/span&gt;&amp;gt;Ponto&amp;lt;/span&amp;gt; {
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">int</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; x;
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">int</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; y;
}
Sem compact headers: 12 bytes (header) + 8 bytes (campos) = 20 bytes → alinha para 24 bytes
Com compact headers: 8 bytes (header) + 8 bytes (campos) = 16 bytes
Em uma aplicação que cria milhões de objetos pequenos - DTOs, entidades, registros de domínio - isso representa:
- Heap menor para o mesmo workload
- Maior densidade de deploy (mais instâncias por máquina)
- Melhor localidade de cache (mais objetos cabem numa cache line)
Como chega para você
Zero mudanças de código. Era experimental/opt-in no JDK 25 e 26. No JDK 27, vira o comportamento default.
Se você quiser desabilitar por algum motivo de compatibilidade:
java -XX:-UseCompactObjectHeaders -jar sua-aplicacao.jar
Vale monitorar
Aplicações que dependem de sun.misc.Unsafe para calcular offsets de campos ou usar Instrumentation.getObjectSize() podem ter comportamento diferente. Teste antes de subir em produção.
2. Structured Concurrency - JEP 533 (7ª Preview)
Sim, ainda em preview. Mas é a 7ª iteração, a API está estável na prática, e o código que você escreve hoje já é muito próximo do que vai ser finalizado.
A ideia central
Structured Concurrency trata um grupo de tarefas relacionadas rodando em threads diferentes como uma única unidade de trabalho. Se uma falha, o escopo inteiro cancela. Se o escopo termina, todas as subtarefas terminam, sem leak de threads.
Como fica o código
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Buscar dados de usuário e pedidos em paralelo&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">try</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; (&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">var</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;scope&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-operator&amp;quot;&lt;/span&gt;&amp;gt;=&amp;lt;/span&amp;gt; StructuredTaskScope.open()) {
Subtask&amp;amp;lt;Usuario&amp;amp;gt; usuario = scope.fork(() -&amp;amp;gt; buscarUsuario(userId));
Subtask&amp;amp;lt;List&amp;amp;lt;Pedido&amp;amp;gt;&amp;amp;gt; pedidos = scope.fork(() -&amp;amp;gt; buscarPedidos(userId));
scope.join(); &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// aguarda ambos&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">return</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">new</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-title class_&amp;quot;&lt;/span&gt;&amp;gt;Perfil&amp;lt;/span&amp;gt;(usuario.get(), pedidos.get());
}
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Ao sair do try: todas as subtarefas foram concluídas ou canceladas&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
Compare com o approach tradicional com CompletableFuture:
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Sem Structured Concurrency — mais verboso e propenso a leak&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
CompletableFuture&amp;amp;lt;Usuario&amp;amp;gt; cfUsuario = CompletableFuture.supplyAsync(() -&amp;amp;gt; buscarUsuario(userId));
CompletableFuture&amp;amp;lt;List&amp;amp;lt;Pedido&amp;amp;gt;&amp;amp;gt; cfPedidos = CompletableFuture.supplyAsync(() -&amp;amp;gt; buscarPedidos(userId));
CompletableFuture.allOf(cfUsuario, cfPedidos).join();
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">return</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">new</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-title class_&amp;quot;&lt;/span&gt;&amp;gt;Perfil&amp;lt;/span&amp;gt;(cfUsuario.get(), cfPedidos.get());
O que mudou da 6ª para a 7ª preview
Refinamentos menores na API - o comportamento principal não mudou. A 7ª preview sinaliza que a Oracle está coletando os últimos feedbacks antes de finalizar. Expectativa de GA no JDK 29.
Structured Concurrency + Virtual Threads
Essa feature foi desenhada para trabalhar com Virtual Threads (JEP 444, finalizado no JDK 21). O scope.fork() cria Virtual Threads por padrão - então você tem concorrência estruturada, escalável e com gerenciamento de ciclo de vida automático.
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Virtual Threads são usados por padrão no fork()&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Sem configuração adicional necessária&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">try</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; (&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">var</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;scope&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-operator&amp;quot;&lt;/span&gt;&amp;gt;=&amp;lt;/span&amp;gt; StructuredTaskScope.open()) {
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// cada fork() → nova Virtual Thread&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
Subtask&amp;amp;lt;String&amp;amp;gt; t1 = scope.fork(() -&amp;amp;gt; chamarServico1());
Subtask&amp;amp;lt;String&amp;amp;gt; t2 = scope.fork(() -&amp;amp;gt; chamarServico2());
Subtask&amp;amp;lt;String&amp;amp;gt; t3 = scope.fork(() -&amp;amp;gt; chamarServico3());
scope.join();
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// ...&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
}
3. Primitive Types in Patterns - JEP 532 (5ª Preview)
Outra que ainda está em preview, mas com semântica congelada, a 5ª preview veio sem mudanças em relação à 4ª.
O problema atual
Antes dessa JEP, pattern matching com instanceof e switch só funcionava com tipos de referência. Primitivos precisavam de boxing explícito ou casos separados.
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Antes: boxing implícito, caso não coberto para primitivos&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;Object&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;obj&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-operator&amp;quot;&lt;/span&gt;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-number&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">42</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt;;
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Funciona, mas passa por Integer (boxing)&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">if</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; (obj &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">instanceof</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; Integer i) {
System.out.println(i + &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-number&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">1</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt;);
}
O que muda
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// Com JEP 532: primitivos diretamente em switch&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">switch</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; (valor) {
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">case</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">int</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; i &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">when</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; i &amp;amp;lt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-number&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">0</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; -&amp;amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;negativo&amp;amp;quot;&amp;lt;/span&amp;gt;;
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">case</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">int</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; i &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">when</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; i == &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-number&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">0</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; -&amp;amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;zero&amp;amp;quot;&amp;lt;/span&amp;gt;;
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">case</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">int</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; i -&amp;amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;positivo: &amp;amp;quot;&amp;lt;/span&amp;gt; + i;
}
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// instanceof com primitivos&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;Object&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-variable&amp;quot;&lt;/span&gt;&amp;gt;obj&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-operator&amp;quot;&lt;/span&gt;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-number&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">3.14</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt;;
&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">if</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; (obj &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-keyword&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-keyword&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">instanceof</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-type&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-type&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-type"</span>><span class="hljs-type">double</span></span>&lt;/span&gt;&amp;lt;/span&amp;gt; d) {
System.out.printf(&amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-string&amp;quot;&lt;/span&gt;&amp;gt;&amp;amp;quot;Double: %&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-number&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">.2f</span></span>&lt;/span&gt;%n&amp;amp;quot;&amp;lt;/span&amp;gt;, d); &amp;lt;span class=&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-string&quot;</span>&gt;&amp;quot;hljs-comment&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class=<span class=<span class="hljs-string">"hljs-string"</span>>&quot;hljs-comment&quot;</span>&gt;<span class=<span class="hljs-string">"hljs-comment"</span>><span class="hljs-comment">// sem cast manual&amp;lt;/span&amp;gt;&lt;/span&gt;</span></span>
}
Por que faz sentido
Completa a consistência do sistema de tipos do Java. Pattern matching foi introduzido para trabalhar com qualquer tipo, fazia sentido estender para primitivos. Especialmente útil em código de parsing, serialização e interoperabilidade com dados externos.
As outras JEPs que chegam no JDK 27
G1 como GC padrão em todos os ambientes - JEP 523
O G1 já era o default em ambientes server. Agora vira o default em todos os ambientes, incluindo containers com poucos recursos. ZGC e Shenandoah continuam disponíveis como opção.
Post-Quantum Hybrid Key Exchange para TLS 1.3 - JEP 527
Implementa algoritmos híbridos de key exchange no TLS 1.3, combinando algoritmos resistentes a computação quântica com algoritmos tradicionais. Sem mudança de código necessária - APIs javax.net.ssl se beneficiam automaticamente.
Linha do tempo até o GA
04 jun 2026 → Rampdown Phase One (feature freeze) ← estamos aqui
→ Rampdown Phase Two
→ Release Candidate
14 set 2026 → General Availability
O que vale acompanhar pensando no JDK 29 (LTS)
As features ainda em preview no JDK 27 que têm alta chance de finalizar no JDK 29:
- Structured Concurrency - 7 previews é muito. A API está madura.
- Primitive Types in Patterns - 5 previews sem mudança = semântica congelada.
- Lazy Constants - 3ª preview, evolução constante.
- Value Classes (Project Valhalla) - candidata forte para o JDK 29.
Resumo
| O que | Impacto | O que fazer |
|---|---|---|
| Compact Object Headers default | Heap menor, sem mudar código | Testar em staging, monitorar Unsafe |
| Structured Concurrency 7ª preview | API estável, safe para usar com flag | Testar em projetos novos |
| Primitive Types in Patterns 5ª preview | Sem mudança, preview final | Experimentar em parsing/serialização |
| G1 default everywhere | GC mais previsível em containers | Sem ação necessária |
| Post-Quantum TLS 1.3 | Segurança de rede melhorada | Sem ação necessária |
O JDK 27 não é LTS, mas traz uma mudança real de performance que chega silenciosamente via Compact Object Headers - e consolida a direção que o JDK 29 vai finalizar em Structured Concurrency e pattern matching.
Referências
Publicado por: Guilherme Gomes - 05/06/2026 09:34
Gostou do conteúdo? Me segue no @getcaramelo.dev
Caramelo.dev