Valhalla: Quando a Performance Encontra a Segurança de Tipos no Java

Valhalla: Quando a Performance Encontra a Segurança de Tipos no Java

Mai 19, 2026 java project valhalla value classes domain-driven design performance optimization type safety cloud development

Tipos Refinados e Performance: O Que o Project Valhalla Vai Mudar

Quem já trabalhou com arquitetura orientada a domínio em Java sabe o dilema. Queremos criar tipos que representem regras de negócio, como um PositiveInt para quantidades que nunca podem ser negativas. O compilador deveria impedir estados inválidos. A segurança deveria vir do próprio sistema de tipos.

Na prática, a história é outra. Quando o código precisa processar milhões de eventos por segundo, esses objetos começam a pesar. Cada PositiveInt consome memória extra e força alocações no heap. O resultado é que a maioria dos times valida os dados na entrada e depois abandona os tipos refinados no caminho crítico.

O Project Valhalla promete mudar essa dinâmica.

O Custo dos Wrappers

Um wrapper simples como PositiveInt ocupa cerca de 16 bytes no HotSpot: 12 bytes de cabeçalho mais 4 bytes do valor. Quando colocamos um milhão desses objetos em um array, não estamos armazenando os valores diretamente. Armazenamos referências que apontam para outras posições na memória.

Isso significa mais consumo de memória, mais acessos indiretos e mais risco de cache miss. O impacto se agrava em loops intensivos, onde cada operação precisa seguir ponteiros em vez de trabalhar com os dados em linha.

A consequência prática é uma limitação arquitetural. Tipos de domínio funcionam bem nas bordas da aplicação, mas perdem espaço nos trechos de alta performance. O desenvolvedor acaba voltando para int ou long para conseguir velocidade, abrindo mão da segurança que o tipo oferecia.

Value Classes: Segurança Sem Peso

O Project Valhalla, já disponível no Java 27 Early Access, traz o conceito de value classes. Diferente de classes tradicionais, elas não possuem identidade. O JVM pode tratá-las como primitivos, guardando-as diretamente em arrays, campos de objetos ou registradores.

O código continua parecendo uma classe normal:

public value class PositiveInt {
    private final int value;

    public PositiveInt(int value) {
        if (value <= 0) {
            throw new IllegalArgumentException("must be positive: " + value);
        }
        this.value = value;
    }

    public int value() { 
        return value; 
    }
}

A validação ainda acontece. O construtor ainda executa. Mas o JVM ganha liberdade para inlinear o valor, eliminando cabeçalhos de objeto e ponteiros. No lugar de um objeto disperso na heap, o int fica diretamente no lugar onde deveria estar.

Value Classes com Múltiplos Campos

A vantagem não se limita a tipos simples. Um Coordinate que contém Latitude e Longitude pode ser definido como value class, com ambos os double armazenados contiguamente. Em uma classe tradicional, teríamos múltiples indireções. Em uma value class, 16 bytes de dados ficam compactados sem nenhum ponteiro.

As an

Continue from where the source ends?

Read in other languages:

RU BG EL CS UZ TR SV FI RO PL NB NL HU IT FR ES DE DA ZH-HANS EN