Now openThe whole vendor lifecycle in one workspace. Benchmarking, negotiations, contracts, invoices, renewals. Free 30 day trial, no card.Start the trial →
Now openThe whole vendor lifecycle in one workspace. Benchmarking, negotiations, contracts, invoices, renewals. Free 30 day trial, no card.Start the trial →
Project team walking through a plan in a boardroom session
Oracle Java · Discovery & Inventory · Sub

How to Inventory Every Oracle Java Install Before Migrating

You cannot migrate off Oracle Java, or defend an audit, from an incomplete inventory. This guide gives you the discovery methodology to find every Oracle JDK and JRE across your estate and separate licensable Oracle binaries from free OpenJDK.

Contact Us Oracle Hub
500+Enterprise clients
$2B+Under advisory
Industry Recognized
500+ Enterprise Clients
$2B+ Under Advisory
11 Vendor Practices
100% Buyer Side Independent

You cannot migrate off Oracle Java, or defend an audit, from an incomplete inventory. This guide gives you the discovery methodology to find every Oracle JDK and JRE across your estate and separate licensable Oracle binaries from free OpenJDK.

Why the inventory is the whole game

Every Oracle Java decision (migrate, renew, or defend an audit) rests on one artifact: a complete, defensible inventory of what is actually installed and running. Get this wrong and you either overpay Oracle for phantom exposure or, worse, sign an employee-metric subscription because you could not prove your Oracle footprint is small enough to remove. In 25 years of negotiating with this vendor, the pattern does not change: the party with the better inventory sets the price.

The stakes are specific. Oracle's Java SE Universal Subscription is priced on total headcount, not deployment. List runs from $15.00 per employee per month at the smallest band down to $5.25 per month at 40,000 to 49,999 employees, with the definition of "employee" including full-time, part-time, temporary staff plus the staff of your agents, contractors, outsourcers, and consultants who support internal operations. A 5,000-employee company pays roughly $630,000 per year at list whether it runs Oracle Java on 40 servers or 400. If your inventory shows 12 licensable Oracle installs that you can remove in a weekend, you do not buy that subscription at all. That is the entire economic argument, and it lives or dies on discovery.

Our field data closes the loop: an estate sweep routinely finds Oracle JDK on 15 to 35 percent of servers assumed to be OpenJDK. Read the discovery gap analysis for the mechanics of why that number is so consistent. This article is the how-to that sits under it: the methodology to find every install before Oracle's LMS scan does.

The party with the better inventory sets the price. Oracle's LMS team runs discovery for a living. You should run yours first.

Scope first: the four surfaces where Oracle Java hides

Most inventories fail because they scan one surface and declare victory. Oracle Java lives on four distinct surfaces, each requiring a different detection technique. Scope all four before you run a single scan, and assign an owner to each.

1. Servers and virtual machines

The traditional target, and still where the bulk of licensable exposure sits. Physical servers, VMs, and the guests inside VMware clusters all need filesystem-level scanning for JDK and JRE binaries. Do not trust CMDB records that list "Java" without a vendor string; those records are almost never accurate down to the Oracle-versus-OpenJDK level.

2. Desktops and laptops

End-user machines carry legacy Oracle JRE installs from the Java 8 era, browser plugins, and application-bundled runtimes. These matter for two reasons: the employee metric's processor ceiling of 50,000 processors is stated exclusive of desktop and laptop computers, but the presence of Oracle binaries on desktops is still evidence of use, and old JRE 8 installs are a favorite audit finding because Oracle knows they are everywhere.

3. Containers and ephemeral workloads

This is where filesystem scanning breaks. A container running an Oracle JDK base image may exist for four minutes and never touch a persistent disk your scanner sees. You need runtime detection that catches JVMs while they execute. Enterprise estates can contain tens of thousands of JVMs across container platforms, and a static scan will undercount them badly.

4. Embedded and third-party bundled Java

The trap that catches the most sophisticated teams. Commercial software often ships with an Oracle JRE inside its install directory. Some of those Oracle runtimes are covered by the vendor's own distribution license; some are not and become your liability the moment you use the product outside the vendor's bundled scope. Your inventory must flag every embedded Oracle JVM and then, separately, determine whether it is covered. We treat this as its own workstream; see migrating third-party apps that bundle Oracle Java.

The core skill: telling Oracle apart from OpenJDK

Since Java 11, Oracle JDK is built directly from the OpenJDK source, so the binaries are functionally identical. Features like JFR and ZGC that were once Oracle-only are upstreamed. This means a version number alone tells you nothing about licensing. You must fingerprint the vendor, not the version. Four signals, in order of reliability:

  • Vendor string from the runtime. Run java -XshowSettings:properties -version and inspect the java.vendor and java.vendor.version properties. Oracle builds report Oracle as the vendor. Community and distribution builds report their own identity, for example a GraalVM Community or Eclipse Temurin string. This is the single most reliable signal and should be your primary key.
  • Installation packaging. Oracle historically shipped native installers (MSI, RPM, DEB) that set JAVA_HOME and register file associations. OpenJDK distributions were more often delivered as compressed archives (tar.gz or .zip) requiring manual configuration. Packaging is a supporting signal, not proof, because both sides now offer both formats.
  • Install path and directory naming. Paths containing jdk-17.0.x under an Oracle-style directory versus temurin, zulu, corretto, or graalvm give a fast triage read before you confirm with the vendor string.
  • Platform default context. Oracle JDK is the historical default on Solaris, Windows, AIX, and macOS; OpenJDK distributions are the package-manager default on Ubuntu, Fedora, RHEL, and OpenSUSE. Use this only to prioritize where to look, never to conclude.
A version number tells you nothing about licensing. Fingerprint the vendor string, then confirm with packaging and path. Everything else is triage.

The version cliffs that turn free installs into liabilities

Your inventory must record the exact update level, not just the major version, because Oracle's free-use terms change mid-version. The No-Fee Terms and Conditions (NFTC), in use since September 2021, permit free use including commercial and production use, but only within defined windows. Miss the window and the same binary becomes payable. These are the cliffs to encode in your inventory logic:

Version Free-use status Cliff / trigger
JDK 8 / 11 (Oracle builds)Licensable for most commercial useLegacy OTN/subscription terms; classic audit target
JDK 17 (17.0.12 and earlier)Free under NFTCLast NFTC build was Sept 2024
JDK 17 (17.0.13 and later)PayableOTN license from Oct 2024; subscription required
JDK 21, 22, 23, 24Free under NFTCFree until September 2026; payable after
JDK 25Free under NFTC in productionFree until September 2028; later updates move to OTN

The dangerous part is that the licensable event is a download, not a purchase. A build pipeline pinned to a "latest" tag is a standing instruction to cross whatever version boundary arrives next, silently. Your inventory must capture patch level to the third digit (for example 17.0.12 versus 17.0.13) and flag any floating references in package managers and container base images. Pin runtimes explicitly. Treat every latest tag pointing at an Oracle repository as an open liability until proven otherwise.

Tooling: no single tool sees everything

There is no one scanner that catches all four surfaces. Build a stack that pairs filesystem discovery with runtime detection, because each covers the other's blind spot.

Filesystem and SAM scanners

Software asset management tools such as Flexera can perform machine and software inventory, capture the presence of specific applications including Oracle Java, and track usage. Dedicated migration scanners find JDKs that are physically present on disk. These are strong for servers, desktops, and persistent VMs, and they are your source of truth for install paths and version strings. Their weakness is ephemeral workloads: a scanner sees only what is on disk when it runs.

Runtime JVM detection

Runtime inventory services (Azul's JVM Inventory is the prominent example) gather data directly from the JVM as it executes, capturing vendor, version, install path, and the running application. This is how you catch ephemeral containers and short-lived processes that filesystem scans miss. The stated limitation is important to plan around: runtime detection does not perform network-wide searches for JDK installations on local or remote file systems. It sees what runs, not what sits idle on disk.

Run the LMS scripts on yourself

Oracle's own detection scripts are available, and running them internally before Oracle does is the single most useful audit-defense move you can make. It shows you exactly what Oracle's tooling will report and lets you remediate before the finding lands in a formal claim. This is part of a disciplined internal program; see our approach to conducting internal Oracle license audits.

Surface Primary method Secondary method Blind spot to cover
Servers / VMsFilesystem SAM scanLMS scriptsVMware guest sprawl
Desktops / laptopsEndpoint agent inventoryManual JRE 8 sweepBrowser plugins, app bundles
ContainersRuntime JVM detectionImage registry scan"latest" tag drift
Embedded / third-partyApp inventory + directory scanVendor license reviewCoverage vs. liability call

The classification step that produces a defensible number

Raw discovery data is not an inventory. Classification is. Every JVM you find must be tagged into one of four buckets, and the bucket, not the count, is what determines your exposure and your migration plan.

  • Licensable Oracle. Oracle vendor string, commercial or production use, outside any NFTC free window. This is your exposure. Count it, path it, and note the running application so you can plan removal.
  • Free Oracle (NFTC in window). Oracle vendor string but within a current no-fee grant, for example JDK 21 today. Not a liability now, but flag every one with its cliff date so it does not silently convert.
  • Covered/bundled Oracle. Oracle binary shipped inside a third-party product under that vendor's own distribution license. Requires a coverage determination per product, not a blanket assumption.
  • OpenJDK / non-Oracle. Temurin, Zulu, Corretto, Microsoft Build, Red Hat, BellSoft, GraalVM Community. Zero Oracle liability. This is where you want everything to end up.

The classification also drives target selection. Once you know which distributions you already trust and where they run well, choosing replacements is faster; our comparison of OpenJDK alternatives to Oracle Java maps the credible options on cost and support SLA. If you are weighing a paid but non-Oracle path, the Azul Zulu versus Oracle Java comparison lays out two very different contracts.

From inventory to migration

A complete inventory feeds directly into execution. The licensable-Oracle bucket becomes your migration backlog, sequenced by risk and effort. Follow the OpenJDK execution guide for the full replacement workflow, and use compatibility testing across JDK vendors to de-risk each swap before it hits production. For large estates, sequence the work with phasing a Java migration across a large estate rather than attempting a single cutover.

Two operational habits protect the inventory after you build it. First, block Oracle's update check-ins so machines stop silently pulling new binaries; see how to block Oracle Java update telemetry. Second, keep the inventory living: re-scan on a schedule, because a static snapshot decays the moment a developer pulls a new base image or an application update ships an embedded runtime.

A one-time scan is a photograph. An inventory that survives an audit is a living register with cliff dates, owners, and re-scan cadence.

What to do this quarter

Move in this order. First, scope the four surfaces and assign owners. Second, stand up filesystem plus runtime detection so you cover both static and ephemeral workloads, and run Oracle's own LMS scripts on yourself. Third, classify every JVM by vendor string into the four buckets and record patch level to the third digit with its cliff date. Fourth, freeze silent conversion by pinning runtimes and blocking auto-updates. Fifth, hand the licensable-Oracle bucket to the migration team and keep the register alive with scheduled re-scans.

Done well, this inventory is worth more than any tool license it consumed. It is the document that lets you decline Oracle's subscription with evidence, or, if you must buy, buy the minimum with the audit posture already handled. Companies that resolved seven-figure Java claims to zero did it on the strength of exactly this kind of inventory work; see the Avis Budget Group case study for what a defensible position looks like in practice.

Frequently asked questions

How do I tell if a Java install is Oracle or OpenJDK?

Run java -XshowSettings:properties -version and read the java.vendor property. Oracle builds report Oracle as the vendor; distributions like Temurin, Zulu, Corretto, or GraalVM Community report their own name. Since Java 11 the binaries are built from the same source, so only the vendor string is reliable. Version number alone tells you nothing about licensing.

Why does the patch level matter, not just the major version?

Oracle's free-use terms change mid-version. Oracle JDK 17.0.12 and earlier are free under the NFTC, but 17.0.13 and later (from October 2024) require a paid subscription. JDK 21 through 24 are free until September 2026. Your inventory must record the exact update level to the third digit or you will misclassify licensable installs as free.

Can a single tool find all my Oracle Java installs?

No. Filesystem and SAM scanners catch installs on disk but miss ephemeral containers. Runtime JVM detection catches running processes but does not search file systems for idle installs. You need both, plus running Oracle's own LMS scripts internally to see what Oracle's tooling will report.

Does Oracle Java on desktops and laptops count toward my license?

The 50,000-processor ceiling in the employee metric is stated exclusive of desktops and laptops, but the employee metric is priced on headcount regardless of where Java runs. Oracle JRE 8 installs on desktops are still evidence of use and a common audit finding, so inventory them even though they do not consume the processor allowance.

What about Oracle Java bundled inside third-party software?

Some embedded Oracle runtimes are covered by the vendor's own distribution license; some are not. Flag every embedded Oracle JVM in your inventory, then make a coverage determination per product. Do not assume bundled means covered, and do not assume it makes it your liability either. It requires a case-by-case review.

How often should I re-run discovery?

A one-time scan decays immediately because developers pull new base images and application updates ship new runtimes. Treat the inventory as a living register with scheduled re-scans, ideally monthly for container estates and quarterly for servers and desktops. Pin runtimes and block auto-updates so machines stop silently crossing version cliffs between scans.

Free White Paper

Defend an Oracle Java audit without overpaying

Oracle now audits Java SE on employee count, not installs, which can multiply the bill several times over. How to defend the notice and exit to OpenJDK.

Gated with a work email on the download page. No sales follow up you did not ask for.

Get the White Paper →
Independent, buyer side. We never share your details with vendors.
Run a software spend health check against your Oracle Java estate in under five minutes.
Open the Tool →
Deep Library

More on this topic.

Oracle Hub →
Migrating Off Oracle Java to OpenJDK: The Execution Guide
Oracle Java · Guide
Migrating Off Oracle Java to OpenJDK: The Execution Guide
The full guide this article belongs to.
Guide
How to Block Oracle Java Update Check-Ins and Telemetry
Oracle Java · Deep dive
How to Block Oracle Java Update Check-Ins and Telemetry
Another angle on the same decision.
Guide
Testing Application Compatibility When Switching JDK Vendors
Oracle Java · Deep dive
Testing Application Compatibility When Switching JDK Vendors
Another angle on the same decision.
Guide
Finding Oracle Java Before Oracle Does: The 15-35% Discovery Gap
Oracle Java
Finding Oracle Java Before Oracle Does: The 15-35% Discovery Gap
An estate sweep finds Oracle JDK on 15-35% of servers assumed to be OpenJDK. Learn the pre
Guide
Internal Oracle license audits. Find it before Oracle does.
Oracle Java
Internal Oracle license audits. Find it before Oracle does.
Run an internal Oracle license audit yearly: scope the full estate, run the LMS scripts yo
Guide
Oracle Java employee licensing. Ten facts every organization must know.
Oracle Java
Oracle Java employee licensing. Ten facts every organization must know.
Oracle Java employee based licensing in 2026. The ten facts that set the bill: the per emp
Guide
Editorial boardroom interior

The advisor your vendors do not want.

500+ enterprise clients. 11 vendor practices. Industry recognized. One conversation can change what you pay for the next three years.

Stay ahead of Oracle licensing changes.

One buyer side briefing a week. Renewal signals, audit moves, and the levers that work. No vendor spin.