Every mainstream Java runtime is built from the same OpenJDK source. Eclipse Temurin, Amazon Corretto, Azul Zulu, the Microsoft Build of OpenJDK, the Red Hat build, BellSoft Liberica, SAP SapMachine and Oracle JDK all compile HotSpot and the class library from that code, so your application almost always behaves the same on each. Yet the choice still matters, because a vendor decides the licence you run under, how long you get security fixes, which platforms and optional components exist, and who answers when a production JVM crashes.

This page explains where vendor builds come from, what genuinely differs between them, how to find out exactly what your fleet runs, and how to choose and switch with low risk. Support dates and licence terms change; the figures below were checked against the vendors' own pages on 2026-10-03.

Advertisement

Where a vendor build comes from

New features land in the OpenJDK mainline repository and ship every six months as a feature release. When a release ships, maintenance continues in an update project (for example jdk21u and jdk25u), where fixes are backported and released quarterly, typically on the third Tuesday of January, April, July and October; the October 2026 update is due on the third Tuesday, 20 October. Vendors take those update tags, apply their own build configuration and sometimes extra patches, test, and publish binaries. The release train itself is covered in Java LTS releases.

Long-term support is a vendor promise, not an OpenJDK property. After the first months of an update project, maintenance is led by vendor engineers, and each vendor decides how long it will keep publishing builds for a release. That is why two vendors can support the same LTS version for different lengths of time.

One source tree, many builds: where vendor differences come fromOpenJDK mainlineopenjdk/jdk, six-month featuresUpdate projectsjdk21u, jdk25u: quarterly fixesfork at releaseTemurinAdoptium, AQAvit testedCorrettoAmazon, own patchesZulu, Liberica, MS,Red Hat, SapMachineOracle JDKNFTC then OTN licenceEach vendor adds: build flags, optional components, backports, TCK run, support horizon, licenceYour runtimeJDK install, container image or jlink imageThe Java code you run is nearly identical; what you choose is a supply chain: who builds, patches and supports it, and on what terms.
Vendors build from the same update projects; differences come from build options, patches, testing, licence and support length, not from different Java.

What genuinely differs

DimensionWhat variesWhy you care
LicenceGPLv2 with Classpath Exception for most builds; Oracle JDK uses its own termsWhether production use costs money
Update horizonHow many years of free quarterly fixes per LTSWhen you are forced to upgrade
PlatformsOS, CPU architecture, musl or glibc buildsAlpine images, ARM servers, older OSes
Optional componentsJavaFX bundles, CRaC-enabled builds, ShenandoahFeatures that exist in one build and not another
Extra patchesSome vendors ship backports ahead of upstreamFixes you may lose when switching
CertificationWhether the build passed the Java SE TCKSpec compatibility evidence
SupportPaid SLAs, response times, custom fixesWho you call during an outage

Two more points. First, the VM is not always HotSpot: IBM Semeru Runtimes use the Eclipse OpenJ9 VM, which has different tuning flags and memory behaviour, so treat it as a different runtime, not just a different vendor. Second, GraalVM distributions add an alternative JIT and native-image tooling on top of a JDK; see GraalVM architecture. Everything else on this page is about HotSpot-based builds.

Optional components are where surprises hide. Shenandoah is built into most OpenJDK distributions but Oracle's JDK builds have not included it, so a flag that works on Temurin can stop the JVM from starting on Oracle JDK. JavaFX is separate from the JDK, but some vendors ship bundles that include it; Amazon ended JavaFX support in Corretto 8 on 31 March 2026. CRaC support for fast startup ships in specific builds from vendors such as Azul and BellSoft rather than in every distribution; see CRaC.

Advertisement

Licensing, and why October 2026 matters

Most vendor builds are free to use in production under the OpenJDK licence, GPLv2 with the Classpath Exception, which does not affect your application's licence. Oracle is different in two ways. Oracle's OpenJDK builds on jdk.java.net are GPL but are updated only for the six months of each feature release, so they are not an LTS option. Oracle JDK, the commercial-branded build, ships under the Oracle No-Fee Terms and Conditions (NFTC) for a limited window and then under the Java SE OTN licence, which requires a paid subscription for most production use.

For JDK 21, Oracle states that updates through the September 2026 release are under NFTC and updates from the October 2026 Critical Patch Update are planned under OTN. If you run Oracle JDK 21 and simply apply the next quarterly patch, you move onto licence terms that may require a subscription. JDK 25 updates are under NFTC until September 2028. The practical options are: buy the subscription, move to JDK 25 and plan the next hop before 2028, or switch to another vendor's 21 build, which for most applications is the cheapest and least disruptive.

Support horizons you can plan against

Each vendor publishes its own calendar. These are the dates listed on 2026-10-03 for the two most common free builds; check the vendor pages again before planning, as they are extended from time to time.

VersionEclipse Temurin (at least until)Amazon Corretto (end of life)
8December 2030December 2030
11October 2027January 2032
17October 2027October 2029
21December 2029October 2030
25September 2031October 2032
27 (non-LTS)March 2027April 2027

Azul, Microsoft, Red Hat, BellSoft and SAP publish their own roadmaps, and paid tiers can extend coverage. The pattern to notice is that horizons differ by years for the same version, so the vendor choice for an old version like 11 or 17 is mostly a choice of how long you can postpone the upgrade. Non-LTS releases get roughly six months from everyone; run them only if you will upgrade every six months.

A horizon only helps if you actually take the updates. Treat each quarterly release as a routine change: subscribe to your vendor's release announcements, let a scheduled job rebuild base images when the new tag appears, run the test suite and a canary, and roll the fleet within a week or two. Security fixes in a quarterly update are public the day it ships, so a runtime that lags by months is exposed whatever its vendor promises. Measure lag as a number, such as days since the newest available update, rather than as a feeling.

Know what you run

Fleets drift. Base images, developer laptops, build agents and vendor appliances each bring their own JDK, and the java -version banner alone does not always name the vendor clearly. Two sources are reliable. The system properties report the vendor and full runtime version, and every modern JDK image carries a release file whose IMPLEMENTOR and JAVA_VERSION_DATE fields tell you who built it and how old its patch level is.

# What is this runtime, really?
java -XshowSettings:properties -version 2>&1 | grep -E 'java\.(vendor|vm\.vendor|runtime\.version|vm\.name) '
cat "$JAVA_HOME/release"            # IMPLEMENTOR, IMPLEMENTOR_VERSION, JAVA_VERSION, JAVA_VERSION_DATE

# Does this build include an optional feature you rely on?
java -XX:+UseShenandoahGC -version  # fails at startup if the collector was not built in
java --list-modules | grep javafx   # only "full" or FX-bundled builds include JavaFX

# Pin the vendor in builds as well as at runtime
#   Gradle toolchain:   vendor = JvmVendorSpec.ADOPTIUM   (or AMAZON, AZUL, ...)
#   actions/setup-java: distribution: 'temurin'           (or 'corretto', 'zulu', ...)
#   Dockerfile:         FROM eclipse-temurin:21-jre@sha256:<digest>

To audit many hosts or images, read the release files rather than starting a JVM per install. The script below flags runtimes more than about one quarter behind and every Oracle-built runtime for a licence check. Oracle's GPL builds also report Oracle Corporation, which is why it flags rather than concludes.

#!/usr/bin/env python3
"""Inventory JDKs: vendor, version and patch age from each $JAVA_HOME/release file."""
import datetime, pathlib, sys

def read_release(java_home):
    info = {}
    for line in (pathlib.Path(java_home) / "release").read_text().splitlines():
        if "=" in line:
            key, value = line.split("=", 1)
            info[key] = value.strip().strip('"')
    return info

def assess(java_home, today=None):
    today = today or datetime.date.today()
    r = read_release(java_home)
    vendor = r.get("IMPLEMENTOR", "unknown")
    version = r.get("JAVA_VERSION", "?")
    built = r.get("JAVA_VERSION_DATE")
    age = (today - datetime.date.fromisoformat(built)).days if built else None
    flags = []
    if age is None or age > 100:            # older than one quarterly update plus slack
        flags.append("behind on quarterly updates")
    if vendor == "Oracle Corporation":
        flags.append("Oracle build: check licence (NFTC, OTN or jdk.java.net GPL)")
    return f"{java_home}: {vendor} {version} built {built} -> {', '.join(flags) or 'ok'}"

for home in sys.argv[1:]:
    print(assess(home))

Worked example: leaving Oracle JDK 21 before the October update

A team runs forty services on Oracle JDK 21, last patched with the July 2026 update, in containers and wants to keep free updates without changing Java version. They choose Temurin 21 because their base images already use Ubuntu and the official eclipse-temurin images fit their build. The plan has five steps.

  1. Inventory: run the release-file audit over every image and host; find the few that use Oracle-only paths or flags.
  2. Swap the base image in one low-risk service, pinned by digest, keeping the same 21 update level so only the vendor changes.
  3. Diff behaviour: compare startup flags, the default trust store (vendors maintain their own CA certificate sets, so test outbound TLS), fonts for any server-side rendering, and time-zone data.
  4. Compare performance with the same heap and GC settings over a full load test; expect differences within noise, and investigate anything larger.
  5. Roll out by service, then make the vendor explicit in Gradle or Maven toolchains and CI so it cannot drift back.

The work is mostly verification, not code change. The real risk is the long tail: a forgotten build agent or vendor appliance still pulling Oracle JDK updates. Container specifics, including memory sizing, are in Java containerization.

How to choose

SituationReasonable defaultReason
No special needs, any cloudTemurinVendor-neutral, widely packaged, TCK and AQAvit tested
Mostly on AWSCorrettoLong horizons, AWS support, Amazon Linux packaging
Azure or Microsoft stackMicrosoft Build of OpenJDKMicrosoft-supported images and guidance
RHEL-based estateRed Hat build of OpenJDKCovered by the RHEL subscription and packaging
Need JavaFX, CRaC or paid long supportAzul or BellSoftBundles and commercial tiers
Already pay OracleOracle JDKUse the support you own; watch licence dates

Above all, choose one per estate. A single vendor with a known calendar is worth more than the best vendor chosen differently by every team.

Failure modes

  • Accidental licence change: an automated update moves Oracle JDK onto OTN terms.
  • Silent end of updates: a vendor's horizon passes and images keep building on an unpatched JDK.
  • Missing feature: a GC, JavaFX or CRaC flag fails on a different build.
  • Trust store drift: outbound TLS breaks because CA sets differ between vendors.
  • Floating tags: latest or major-only image tags change vendor patch level without review.
  • Mixed fleets: bug reports cannot be reproduced because laptops, CI and production run different builds.

What to do next

  1. Inventory every JDK in images, hosts and CI, recording vendor, version and build date.
  2. List every Oracle JDK install and decide, before the October 2026 update, whether to subscribe, move to JDK 25 or switch vendor.
  3. Choose one default vendor and record its support dates for each Java version you run.
  4. Pin images by digest and toolchains by vendor so builds cannot drift.
  5. Add a CI check that fails when a runtime is more than one quarterly update behind.
  6. Test GC flags, optional modules and outbound TLS whenever you change vendor.
  7. Trim the runtime you ship with jlink once the vendor is fixed.
Key takeaway: OpenJDK vendors build the same Java from the same update projects, so switching rarely changes application behaviour. What differs is the licence, how long each version gets free quarterly fixes, platforms, optional components such as Shenandoah, JavaFX and CRaC, extra patches and paid support. Oracle JDK 21 moves from NFTC to OTN terms with the October 2026 update, while Temurin and Corretto publish multi-year horizons. Inventory what you run from release files, choose one vendor per estate, pin it in images and toolchains, and test GC flags, modules and TLS when you switch.