Value-Klassen brauchen weiterhin Compiler-Unterstützung

Value Classes Still Need Compiler Sympathy

JEP 401, ein Meilenstein des Valhalla-Projekts, ist als Preview-Feature in JDK 28 integriert worden. Value-Klassen versprechen bessere Performance durch den Verzicht auf Identität, doch der Autor zeigt anhand von drei Beispielen, dass die JVM nicht immer von dieser Freiheit profitiert. So kann eine flache Darstellung bei manchen Methoden schneller sein, während andere eine Referenzdarstellung benötigen. Die daraus resultierenden Konvertierungen können sogar zu Leistungseinbußen führen, wie ein Fall aus der Praxis zeigt, bei dem die Umstellung auf Value-Records zu einer Verlangsamung führte. Der Artikel analysiert die Ursachen und gibt Einblicke in die aktuellen Grenzen der JVM-Optimierung.

Ein wohlmeinendes Programm kann die JVM in eine Situation bringen, in der eine flache Darstellung für einige Methoden schneller ist und eine Referenzdarstellung für andere – und wenn diese Methoden interagieren, ist die JVM gezwungen, zwischen den beiden Darstellungen zu konvertieren.
  1. DarkNova6

    Guter technischer Überblick, und ich stimme der Aussage am Ende voll und ganz zu:

    ```

    Die Deklaration einer Value-Klasse ist in erster Linie eine semantische Entscheidung. Sie sagt unseren Programmierkollegen, dass ihre Instanzen vollständig durch ihren Zustand definiert sind und keine Identität benötigen. Dieses klarere Modell ist an sich schon wertvoll! Die zusätzliche Freiheit der JVM, zu optimieren, wie diese Werte dargestellt werden, ist ein willkommener Bonus.

    ```

    Viele Entwickler scheinen zu denken: "Go value go broom", aber die Wahrheit ist viel nuancierter und die Idee sollte nicht sein, über "aber Performance" nachzudenken, sondern über die Natur deiner zugrunde liegenden Daten. Zumindest integriert dies einige Kernlektionen aus DDD direkt in die Sprache. Ich bin froh, dass das Zerreißen aus genau diesem Grund nicht standardmäßig aktiviert ist.

    Java war schon immer eine Sprache, die darauf ausgelegt war, Bibliotheken einfach zu nutzen, mit großem Vertrauen in den Bibliotheksautor und starker Kapselung. Jetzt können Experten deutlich mehr Leistung aus der JVM herausholen, während bescheidenere Programmierer davor bewahrt werden, Bugs zu erzeugen, die sie nicht erwarten würden.

  2. aatd86

    Natürlich tun sie das, unabhängig von der Sprache. Deshalb gibt es zum Beispiel Dinge wie String-Interning. :)

  3. ferrule

    Escape-Analyse leistet hier die schwere Arbeit. Bis sie vollständig zuverlässig ist, rätst du immer noch bei der Allokation.

  4. pan_lid

    Die Escape-Analyse der JVM war schon immer Glückssache. Schön zu sehen, dass sie vorhersehbarer wird.

  5. dist-epoch

    Seit ihrer Entstehung war das Java-Versprechen: "Mach dir keine Sorgen um Low-Level-Dinge wie Wert-/Referenzklassen, ein genügend intelligenter Compiler wird automatisch die beste Option basierend auf deinem Code und Laufzeit-Profiling wählen."

    Was hat sich geändert, warum übernehmen sie plötzlich C++-Funktionen, die sie explizit ausgeschlossen haben?

    https://wiki.c2.com/?SufficientlySmartCompiler

Mehr von diesem Tag

2026-08-26