Project Valhalla : quand la performance Java rencontre la sécurité des types

Project Valhalla : quand la performance Java rencontre la sécurité des types

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

Domain-Driven Design et Performance : Ce que Valhalla Change pour Java

En Java, beaucoup de développeurs se sont déjà heurtés à ce dilemme. On veut créer un type PositiveInt pour garantir qu’une quantité ne peut jamais être négative. Le compilateur doit bloquer les états invalides. La sécurité prime.

Mais dès qu’on arrive sur un chemin critique, avec des millions d’événements à traiter, ces wrappers deviennent un frein. Chaque objet pèse 16 octets, les allocations s’accumulent, et les performances chutent. Depuis des années, la règle est simple : valider les données en entrée, puis revenir à des primitives pour la vitesse.

Project Valhalla remet cette règle en question.

L’Ancien Problème : La Surcharge des Wrappers

Prenons un exemple concret. Un wrapper comme PositiveInt qui encapsule un int consomme 16 octets sur HotSpot. Dans un tableau de un million d’éléments, ce ne sont pas les valeurs qui sont stockées, mais des références. Chaque accès passe par un pointeur, avec le risque d’un cache miss.

Le résultat est clair : un wrapper utilise quatre fois plus de mémoire qu’un int brut. Et les accès aléatoires aggravent encore la situation. Ce constat a longtemps limité l’usage des types riches. Ils restaient cantonnés aux frontières de l’API, où la validation est nécessaire. Mais dans les boucles chaudes, les développeurs abandonnaient souvent la sécurité pour retrouver la performance.

Value Classes : Sécurité Sans Surcoût

Project Valhalla, présent dès la version 27 Early Access, apporte le keyword value. 与 des classes normales qui ont une identité et doivent être allouées sur le heap, les value classes sont identity-free. Le JVM peut les aplatir dans la mémoire. Elles peuvent se trouver directement dans un tableau, un champ d’objet ou un registre CPU.

Voici ce qu’on obtient :

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; 
    }
}

Le code ressemble presque à une classe ordinaire. La validation reste présente. Mais le JVM peut maintenant mettre le int de quatre octets directement dans la mémoire sans objet complet, sans indirection et sans risque de cache miss.

Plusieurs Champs dans une Value Class

La leistungsfähigkeit reicht bis zu plusieurs primitives. Mis en exemple est Coordinate mit Latitude et Longitude, 16 bytes de données, 0 Zeiger.

In traditionellen Systemen gab es trois niveaux d’indirection. Avec value classes, les doubles sont direkt nebeneinander gelagert.

Read in other languages:

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