JEP 401 Value Objects (Preview) Targeted to JDK 28
JEP 401, Value Objects, has been formally targeted to JDK 28 as a preview feature. This is the first user-facing part of Project Valhalla to land in a JDK release train. It introduces a value modifier for classes and records. A value object is immutable and has no identity: two value objects are the same if they belong to the same class and have the same field values. Code that uses the feature must be compiled and run with --enable-preview.
The semantic changes are deliberate and visible. For value objects, == compares field values recursively instead of comparing references. Identity-dependent operations are rejected: synchronized on a value object throws IdentityException, and so do wait() and notify(). As part of the preview, about thirty platform classes are migrated to value classes, including Integer, Long, Optional, LocalDate, and LocalTime. String stays an identity class because too much existing API behaviour depends on its identity.
Performance is the main motivation. Without identity, the JVM can flatten a value object's fields into its containing reference or array. The JEP gives the example of a LocalDate packed into a single 64-bit word. The JIT can also scalarize value objects into plain locals, removing pointer chasing and allocation. The JEP lists guaranteed layouts as a non-goal, so the JVM keeps freedom over when and how to optimise. Developers should start auditing code that synchronises on boxed primitives or relies on == identity for wrapper types, because that code behaves differently once the preview is enabled.
Read more — OpenJDK
JDK 28 Momentum: AOT Code Compilation Proposed to Target, GraalVM 25.4, Gradle 9.8 and Maven 4 RC7
InfoQ's roundup for the week of September 21 reports that JEP 544, Ahead-of-Time Code Compilation, is now Proposed to Target for JDK 28. It extends the Project Leyden AOT cache work so that optimised native code is available as soon as HotSpot starts, which targets both startup and warmup time. Two ZGC JEPs covering adaptive heap sizing and faster startup (JEPs 545 and 546) moved to Candidate, and JDK 28 early-access build 17 shipped.
Several tooling releases are relevant to anyone moving to JDK 27. Gradle 9.8.0 went GA with Java 27 support, reuse of Maven mirror settings, and a reported 45% performance improvement on Windows. Apache Maven 4.0 RC7 added a lock-free AsyncDrainWriter, and the Maven team expects the long-awaited 4.0 GA "in the coming weeks". GraalVM 25.4 brought new compiler optimisation phases, including an extended OptimizeDivPhase for division.
On the framework side, Hibernate ORM 8.0 Beta3 extends its support for Jakarta Persistence 4.0-M4 with the new @PostCreate and @PreClose lifecycle annotations. Quarkus 3.39.5 is a security release that fixes 32 CVEs across its dependency tree. Open Liberty 26.0.0.10 adds beta support for JDK 27, and its release notes call out that G1 is now the default collector. TornadoVM 7.0.0 added a TileContext API for writing tiled GPU kernels. Groovy 6.0 shipped lexer and parser performance improvements.
Read more — InfoQ