- GraalVM Release Calendar
- Vulnerability Advisories
- GraalVM 25.5
- GraalVM 25.4
- GraalVM 25.3
- GraalVM 25.2
- GraalVM 25.1
- GraalVM 25
- GraalVM for JDK 24
- GraalVM for JDK 23
- GraalVM for JDK 22
- GraalVM for JDK 21
- GraalVM for JDK 20
- GraalVM for JDK 17
- GraalVM 22.3.x
- GraalVM 22.2.x
- GraalVM 22.1.x
- GraalVM 22.0.x
- GraalVM 21.3.x
- GraalVM 21.2.x
- GraalVM 21.1.x
- GraalVM 21.0.x
- GraalVM 20.3.x
- GraalVM 20.2.x
- GraalVM 20.1.x
- GraalVM 20.0.x
- GraalVM 19.3.x
GraalVM 25.5.5.0.3
(2026-11-03)
- Platform and Distributions
- Graal Compiler
- Native Image
- Polyglot Runtime
- GraalJS
- GraalPy
- Truffle Framework
Platform and Distributions
- Released GraalVM Community Edition 25.5.5.0.3, an innovation release based on OpenJDK 25.0.5.0.3. See OpenJDK 25 Updates.
- Released Oracle GraalVM 25.5.5.0.3, an innovation release based on Oracle JDK 25.0.5.0.3. See Java SE 25.0.5 Release Notes.
- Version compatibility: GraalVM 25.5.5.0.3 is compatible with Graal Languages and other components version 25.5.5.0.3.
- Updated Java’s certificate trust configuration to address the eMudhra certificate incident: compromised intermediate CA certificates are now distrusted, and related eMudhra and Comodo root CA certificates are removed. See CVE-2026-91403 and CVE-2026-114820.
Graal Compiler
- Added aggressive partial loop unrolling and simulation-based loop peeling compiler optimization. Aggressive partial unrolling is enabled by default and can be disabled with
-Djdk.graal.AggressivePartialUnroll=false. The original simple partial unrolling remains available, and all partial unrolling is controlled by the master-Djdk.graal.PartialUnroll=falseoption. - Added
RangeCheckEliminationPhase, which rewrites eligible 64-bit range checks to equivalent 32-bit forms after counted strip mining. The optimization is enabled by default and can be disabled with-Djdk.graal.RangeCheckElimination=false. - Added
BreakChainedPhisPhase, which splits chained loop phi values in the low tier to improve register allocation. The optimization is enabled by default and can be disabled with-Djdk.graal.BreakChainedPhis=false. - Added partial redundancy elimination scheduling to the community compiler. The optimization is enabled by default and can be disabled with
-Djdk.graal.PartialRedundancyScheduling=false. - Added a write sinking optimization that moves eligible field and constant-offset array writes out of loops. The optimization is enabled by default and can be disabled with
-Djdk.graal.OptWriteSinking=false. - Added a deduplication optimization that can reduce generated code size by sharing equivalent statements and expressions from converging control-flow branches. The optimization is enabled by default and can be disabled with
-Djdk.graal.OptDeDuplication=false. - Extended lock elimination to coarsen locks across simple control flow and eliminate nested locking of the same object.
- Added
GuardRangeGroupingPhase, which removes redundant integer range guards by retaining the tightest lower and upper bounds for guards with the same anchor. The optimization is enabled by default and can be disabled with-Djdk.graal.OptGuardRangeGrouping=false. - Added an optimization that replaces eligible loop-carried memory reads with value phis, allowing invariant reads to move out of the loop. The optimization is enabled by default and can be disabled with
-Djdk.graal.OptimizeLoopAccesses=false. - Added early checkcast expansion to expose null and type checks as control flow for subsequent optimizations. It is enabled by default and can be disabled with
-Djdk.graal.EarlyExpandCheckCast=false. - Added speculative store checks, which can remove array store checks by speculating that an array’s declared type is exact. The optimization is enabled by default and can be disabled with
-Djdk.graal.SpeculativeStoreCheck=false. - Added strip mining for counted and non-counted loops, loop inversion, loop rotation, and exact arithmetic optimization. Strip mining bounds long-running loop bodies to reduce safepoint overhead, loop inversion transforms while loops into guarded do-while loops to improve instruction pipelining, and loop rotation transforms selected non-counted loops into counted loops by duplicating loop-body code. Exact arithmetic optimization replaces exact additions with normal additions while preserving overflow behavior through loop-limit deoptimization. These optimizations are enabled by default and can be controlled with their corresponding options, including
-Djdk.graal.LoopRotation=falseand-Djdk.graal.OptExactArithmetic=false.
Native Image
- Added the
org.graalvm.nativeimage.graalosJava system property to identify images built for GraalOS at build time and runtime. - Native Images built with
--enable-monitoring=jvmstatcan attach to file-backed JVMStat performance data from other HotSpot and Native Image processes on Linux and macOS. JDK tools such asjstack,jinfo,jps, andjstatcan run on Crema to inspect other JVM processes. - Added an unboxed calling convention for compiled Truffle-to-Truffle calls.
- Unrecognized Native Image options starting with
-or--now produce an error instead of being interpreted as a main class or output filename. This also rejects positional output names beginning with a dash. To keep using such a name, specify it with-o, for examplenative-image -jar hello.jar -o --my-image, or prefix the positional name with./. - Updated the bundle format to version 2.0, with explicit path root kinds, build argument groups that retain their source platform, and persistent markers for unavailable inputs. Older bundle formats remain readable.
- Added auxiliary images, a mechanism for persisting runtime-allocated objects and runtime-compiled code and loading them in later executions of the same native image.
Polyglot Runtime
- Added support for auxiliary engine caching in GraalVM Community Edition.
- Added
FileChannel. On JDK 22 and later, itsmapmethod maps file regions toMemorySegmentinstances whose lifetime is controlled by a caller-providedArena. - Added file-locking support to
FileChannelthrough thelockandtryLockmethods. - Documented
ContextandEnginelifecycle management, including the conditions for automatic closure. For more information, see the Embedding Languages documentation.
GraalJS
- Added
js.foreign-object-prototype=specialized-onlymode to make generic foreign objects inherit directly fromObject.prototype, improving compatibility withObject.getPrototypeOf(foreign) === Object.prototypechecks. Specialized foreign prototypes and the existingtrue(default) andfalsemodes are unchanged.
GraalPy
- Added
select.poll()on Linux and macOS. - Improved Windows console support and Windows version reporting.
Truffle Framework
- Added
HostCompilerDirectives.BytecodeInterpreterHandlerConfig.enableTailDuplication()to opt threaded bytecode handlers into dispatch-tail duplication. It is disabled by default. - Added
CompilerDirectives.mergeExplodeKey()to explicitly mark a local variable as a key for@ExplodeLoop(MERGE_EXPLODE)methods. Migrate merge-exploded loops to use this method to catch unintended graph size explosions. - Extended
HostCompilerDirectives.BytecodeInterpreterHandlerConfig.Argument.Field.templateVariable()to support per-field template variant counts for bytecode handler threading, and added template-aware main dispatch from the switch loop. TruffleFile.newByteChannelnow returnsFileChannel, enabling file regions to be mapped toMemorySegmentinstances on JDK 22 and later.FileChannelinstances returned byTruffleFile.newByteChannelnow expose file locking through thelockandtryLockmethods when supported by the underlying file system.- Made the Bytecode DSL ClearLocal builtin non-optional. Rename custom operations that conflict with this builtin.
- Added
DynamicObject.SetAllPropertyFlagsNodeto update flags of multiple existing properties without assigning their values. It supports uniform flags, per-key flags, and remove/add masks. - Added
HostCompilerDirectives.BytecodeInterpreterHandlerConfig.Argument.expandedType()to select an exact concrete class for virtual argument expansion. AddedArgument.Field.validWhen()andvalid()to control incoming field validity by template state. - Added
GenerateBytecode.unwindExceptionsto the Bytecode DSL to select exceptions that run finally cleanup while bypassing guest catches and exception interception, preserving exception identity across suspension and resumption. - Added
PropertyGetter.getShape()to expose the shape accepted by a property getter.