Every couple of years someone announces that Java is dead. Then they deploy their new service to a cloud running on Java, pay for it through a bank running on Java, and complain about it in a Slack thread.

Java turned 30 in 2025 and is still one of the most used languages in the world. Here is why, what our developers think of it and what comes next.

From a TV remote to the world's back office: a short history of Java

Java was not born to run banks. It was born to run gadgets.

In June 1991, James Gosling, Mike Sheridan and Patrick Naughton started a small project at Sun Microsystems, known internally as the Green Project (Computer History Museum). The plan was a language for consumer devices: set-top boxes, home appliances, interactive TV. The first version was called Oak, and on 2 September 1992 the team demonstrated it running on Star7, a handheld controller with a touch screen and a cartoon-style interface. It was, in effect, a very ambitious TV remote.

The TV industry was not ready. The internet was.

Renamed Java, the language was introduced at the SunWorld conference on 23 May 1995 (dev.java), with a promise every Java developer has heard a thousand times: write once, run anywhere. Java compiled to bytecode, and a Java Virtual Machine ran that bytecode on whatever hardware it found. Browsers ran applets, which most of us remember as the gray box that asked for a plugin update. Servers, it turned out, were where Java really belonged.

The rest of the story reads like a corporate thriller with a happy ending:

  • the late 1990s and 2000s: Java 2 Enterprise Edition puts Java into the back office of banks, insurers and telcos, along with its famously verbose XML;
  • November 2006: Sun begins releasing Java under the GPL, the start of OpenJDK (FSF);
  • January 2010: Oracle completes its acquisition of Sun, and Java with it (phys.org);
  • March 2014: Java 8 brings lambdas and streams, and becomes the version a large part of the world still runs;
  • 2018: Java 10 starts the six-month release cadence, and the language begins to change faster than it had in a decade;
  • September 2025: Java 25 ships in the year of Java's 30th birthday, which the release numbering makes look suspiciously planned.

Not bad for a remote control.

Java does not have an easy life. Python developers make fun of its boilerplate. C programmers laugh at its class names. C++ developers hold it against Java that you cannot shoot yourself in the foot with manual memory management.

So is Java dead in 2026? Not by a long shot.

  • It is 4th in the TIOBE index for September 2026, behind Python, C and C++ (TIOBE).
  • 29.4% of developers in the Stack Overflow Developer Survey 2025 used Java in the past year (Stack Overflow).
  • Java 21 is now the version developers use most, at 40%, ahead of Java 17 at 39% (JetBrains State of Java 2025). The ecosystem is moving forward, not standing still.

Why does it hold on? Above all, Java is a remarkably well-balanced language. It is fast enough for almost anything, easy enough to hire for, secure enough for banks and backed by an ecosystem that has an answer for most problems: Spring for web applications, Kafka for event streams, Hazelcast for in-memory data, and thousands of libraries in between. It also runs the planning software for missions to Mars at NASA (Maestro), which is a decent reference to have.

Underneath sits the idea that made Java famous. Code compiles to bytecode, the JVM runs it anywhere, and the JIT compiler turns the hot parts into machine code tuned to the actual workload. It is also a strongly typed, object-oriented language with C-style syntax, garbage collection and reflection, which is a very boring description of a combination that large companies find extremely comforting.

In short, Java's popularity rests on two things: an enormous community and ecosystem, and a mix of features that enterprises value more than novelty. Our Java applications examples show where it runs today, from banks and exchanges to Netflix and Minecraft.

Embracing modernity: what is new in Java, and what is coming

For years, Java's reputation was that it changed slowly, because the organizations running it upgrade slowly. The language itself stopped being slow a while ago.

How Java's release cadence changed

Until 2017, a new Java version arrived every few years, packed with features and waited for like a solar eclipse. Java 9 was the last release on that schedule. From Java 10 in March 2018, a new feature release ships every six months, in March and September, like clockwork.

In 2021 Mark Reinhold, chief architect of the Java Platform Group at Oracle, proposed shortening the time between long-term support releases from three years to two (Moving Java Forward Even Faster). It happened: Java 17, 21 and 25 are LTS releases, and Java 29 is next, planned for September 2027. Features that are not ready ship as previews, get feedback across several releases and become final only when they are right.

Java releases from Java 8 to Java 27, and the planned Java 28, with what each changed. Java 8 (LTS), Mar 2014: Lambdas, streams and java.time; the baseline many systems still run on. Java 9, Sep 2017: Module system; the last release on the old multi-year schedule. Java 10, Mar 2018: var for local variables; the first release on the six-month cadence. Java 11 (LTS), Sep 2018: Standard HTTP client; Java EE and CORBA modules removed from the JDK. Java 14 to 16, 2020 to 2021: Switch expressions (14), text blocks (15), records (16). Java 17 (LTS), Sep 2021: Sealed classes; the minimum Java version for Spring Boot 3 and 4. Java 21 (LTS), Sep 2023: Virtual threads, pattern matching for switch, record patterns, generational ZGC. Java 24, Mar 2025: Virtual threads no longer pin in synchronized; Security Manager permanently disabled; AOT class cache. Java 25 (LTS), Sep 2025: Compact source files and instance main methods, scoped values, module imports, compact object headers, AOT ergonomics. Java 26, Mar 2026: HTTP/3 in the HTTP client, AOT object caching with any GC, Applet API removed. Java 27, Sep 2026: Compact object headers on by default, G1 the default collector on every machine, post-quantum hybrid key exchange in TLS 1.3. Java 28, planned for March 2027: value objects in preview, ahead-of-time code compilation, final structured concurrency (proposed) and a JSON API in incubation.FROM JAVA 8 TO JAVA 28: THE RELEASES THAT CHANGED THE LANGUAGEMar 2014Java 8LTSLambdas, streams and java.time; the baseline manysystems still run onSep 2017Java 9Module system; the last release on the old multi-yearscheduleMar 2018Java 10var for local variables; the first release on thesix-month cadenceSep 2018Java 11LTSStandard HTTP client; Java EE and CORBA modules removedfrom the JDK2020 to 2021Java 14 to 16Switch expressions (14), text blocks (15), records (16)Sep 2021Java 17LTSSealed classes; the minimum Java version for SpringBoot 3 and 4Sep 2023Java 21LTSVirtual threads, pattern matching for switch, recordpatterns, generational ZGCMar 2025Java 24Virtual threads no longer pin in synchronized; SecurityManager permanently disabled; AOT class cacheSep 2025Java 25LTSCompact source files and instance main methods, scopedvalues, module imports, compact object headers, AOTergonomicsMar 2026Java 26HTTP/3 in the HTTP client, AOT object caching with anyGC, Applet API removedSep 2026Java 27Compact object headers on by default, G1 the defaultcollector on every machine, post-quantum hybrid keyexchange in TLS 1.3Mar 2027Java 28PLANNEDValue objects (preview), ahead-of-time codecompilation, final structured concurrency(proposed), JSON API (incubator)Long-term support (LTS) releaseFeature release, six months of updates
The Java releases that changed how Java code is written and run, with LTS releases marked and Java 28 as planned in October 2026. Sources: the OpenJDK project pages for JDK 28 and earlier releases.

Highlights from Java 21 to Java 27

Virtual threads (JEP 444, Java 21) let a server handle a thread per request again, with plain blocking code, for services that spend most of their time waiting on databases and other services. Pattern matching for switch and record patterns (JEP 441, JEP 440) make data-oriented code much shorter:

sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}

double area(Shape shape) {
    return switch (shape) {
        case Circle(double r) -> Math.PI * r * r;
        case Square(double s) -> s * s;
    };
}

Java 22 finalized the Foreign Function and Memory API (JEP 454), a safe replacement for JNI and for poking at off-heap memory. Java 25 finalized scoped values (JEP 506), a cleaner way to share request context than ThreadLocal, and compact source files (JEP 512). The latter finally answers the oldest joke about Java, the five-line Hello World:

void main() {
    IO.println("Hello, World!");
}

Senior developers will not write many programs like that. Students and people trying Java for the first time will, and a language needs a steady supply of both.

Under the hood, the runtime kept getting faster without anyone touching their code: compact object headers, faster garbage collectors and an ahead-of-time cache for startup. Our article on how Java enables high performance covers those in detail.

What happened to string templates?

If you read about Java 21 a few years ago, you may remember string templates, Java's answer to string interpolation with the slightly odd STR."Hello \{name}" syntax. They previewed twice, and then the third preview was withdrawn in 2024 (JEP 465) so the design could be reconsidered.

That is the preview process working as intended: a feature that is not right does not ship, even if it was announced. For a language that has to stay compatible for decades, that is a feature too.

What is coming next

JDK 28, due in March 2027, already has its first features lined up (OpenJDK):

  • Value objects in preview (JEP 401), the first visible result of Project Valhalla: classes without identity, which the JVM can store and pass around like primitives.
  • Structured concurrency, proposed to become final after seven previews (JEP 543).
  • Ahead-of-time code compilation (JEP 544), which stores compiled native code from a training run so an application starts fast and warm.
  • A simple JSON API in incubation (JEP 540), and generational mode by default for the Shenandoah collector (JEP 535).

Value objects are the one Java developers have waited for the longest. In the JEP's own example, two records with the same values become simply equal:

value record Point(int x, int y) {}

Point p = new Point(17, 3);
boolean same = new Point(17, 3) == p;   // true: value objects have no identity

Structured concurrency, meanwhile, treats a group of concurrent tasks as one unit of work, so that errors and cancellation behave the way you would expect:

Response handle() throws ExecutionException, InterruptedException {
    try (var scope = StructuredTaskScope.open()) {
        Subtask<String> user = scope.fork(() -> findUser());
        Subtask<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();   // join subtasks, propagating exceptions

        return new Response(user.get(), order.get());
    }
}

Why is Java so popular today? Senior developers' insights

So we know why companies choose Java. But do developers actually enjoy working with it? What drives them up the wall?

We asked some of our most experienced senior developers for their honest opinions about the language they have spent many thousands of hours with. Here is the short version, then the long one.

What our senior developers like about Java: versatility, one language for web back ends, data pipelines and trading engines; the community and ecosystem, where most problems already have a library such as Spring, Kafka or Hazelcast; bytecode and the JIT compiler, which run code anywhere at speeds close to native code; solid foundations, after thirty years bugs are in application code rather than the JVM; readable code, because the language nudges teams toward clear names and structure; and a platform that gets better every six months, with new releases adding speed and features without breaking old code.SIX THINGS OUR SENIOR DEVELOPERS LIKE ABOUT JAVA1VersatilityWeb back ends, data pipelines, trading engines: one language for all2Community and ecosystemSpring, Kafka, Hazelcast: most problems already have a library3Bytecode and the JITWrite once, run anywhere, at speeds close to native code4Solid foundationsThirty years in, the bugs are in our code, not in the JVM5Readable codeThe language nudges teams toward clear names and structure6Better every six monthsNew releases add speed and features without breaking old code
Six things our senior developers value most in Java, summarized from the interviews and from what recent releases added.

What makes Java great?

Great versatility

Java is a bit of a jack of all trades. It will not break performance records against hand-tuned C++, and Python has the larger toolbox for data science and AI experiments. But overall it is remarkably well balanced: powerful enough for most projects, easy enough to work with, and backed by libraries and frameworks that make a developer's job much easier.

Active developer community

A large share of what makes Java productive comes from its community: libraries, frameworks and tools that solve common problems so nobody has to reinvent them, from Spring to Kafka to Hazelcast. That means more reuse, less code to maintain and more time for the problems that are specific to your business.

Stability and a multitude of solutions developed by the community, much of it open source, is one of the key things I like about Java. These solutions provide a great sense of security and ensure that a situation when, for example, a component will stop working because the author of a library has stopped working on it, won't happen.

Artbob, Senior Java Developer, Stratoflow

Platform independence and the JIT compiler

Code written in Java runs on any platform with a JVM, and the just-in-time compiler turns the hot parts of the bytecode into optimized machine code while the application runs, using what it learns about the actual workload.

The great concept of bytecode makes it so you don't have to worry about the architecture of the computers you are coding for, and at the same time, the performance is the same or sometimes even better than languages compiled for a given platform, thanks to JIT.

Wojciech Gdela, Senior Java Developer, Stratoflow

Solid foundations

Java and the JVM have been in production for three decades. The teething problems were solved long ago, and the platform behaves predictably under load, which is exactly what you want from something that runs a ledger.

By this point, there is virtually no risk of unexpected problems arising due to something no one can explain. By now almost all bugs are due to errors in our software or libraries, and not the language or environment itself.

Artbob, Senior Java Developer, Stratoflow

The JVM has also become home to other languages, such as Kotlin and Scala, so teams can use a more specialized language for one part of a system while keeping a core written in Java years ago. FastPost, the accounting platform we developed for Legerity, processes a billion transactions in under an hour on the JVM (case study).

Encouraging developers to write cleaner code

Java nudges programmers toward readable code. Some call it pedantic. The move away from one-letter names and cryptic abbreviations, and the way memory management stays out of sight, let a codebase focus on the business logic, which in enterprise software is the part that matters most.

I like Java for making it easier and sometimes even forcing programmers to make the code they write readable and well laid out, making it easier for their colleagues to understand the entire code base.

Wojciech Gdela, Senior Java Developer, Stratoflow

It keeps getting better, without breaking your code

The newest reason to like Java is how it ages. Most languages make you choose between stability and progress. Java, lately, delivers both: a new release every six months, and code written for Java 8 that still runs on Java 27, apart from removed APIs and JDK internals.

For a team that means improvements arriving almost for free. Virtual threads made blocking code scale, records and pattern matching shortened everyday code, and each upgrade brings a faster garbage collector, a smaller memory footprint or quicker startup, usually without touching a line of business logic. Few platforms let a ten-year-old codebase get faster just by moving to the next release.

What do developers find most annoying about Java?

Of course, not everything about Java is loved. Here are the three things that bother our senior developers the most, and, since the interviews, how much modern Java has done about each.

What our senior developers dislike about Java, and what modern Java did about it. Boilerplate and long names: much better, records, var, text blocks and compact source files cut it down. Dependency hell: still your job, managed with BOMs, regular updates and dependency scanning. Complicated generics: unchanged, wildcards and nested generics are as tricky as they were.WHAT ANNOYS THEMWHAT MODERN JAVA DID ABOUT ITBoilerplate and long namesRecords, var, text blocks andcompact source files cut it downMUCH BETTERDependency hellStill your job: BOMs, regularupdates and dependency scanningSTILL YOURSComplicated genericsWildcards and nested genericsare as tricky as they wereUNCHANGED
Three complaints from our senior developers, and how far Java 10 to 27 has addressed each.

Boilerplate code

No surprise at number one. Java's emphasis on explicitness and strong typing produces a lot of repetitive code: getters, setters, equals and hashCode, long type declarations, ceremony around exceptions and resources.

In a lot of situations, simple things require writing a lot of code. There are also long class names which often make things hard to read and understand. That's the two main things I dislike about Java.

Martyna Szczepańska, Senior Java Developer, Stratoflow

Here, modern Java has genuinely listened. Records replace whole classes of data-carrying boilerplate, var removes repeated type names, text blocks end string concatenation for SQL and JSON, and compact source files shrink the smallest programs. The long class names are, admittedly, still a cultural choice.

Dependency hell

Another senior developer pointed to dependencies, a problem JavaScript developers know only too well. Transitive dependencies, version conflicts and libraries that change behavior between versions can make a large codebase hard to reason about. When one library needs an urgent security update, it can drag half the project along with it.

I would say that the so-called dependency hell is one of the most annoying aspects of Java. In more complex projects, there can be so many dependencies on external libraries that they sometimes affect each other, which can lead to unexpected and undesirable outcomes that devs might not even be aware of.

Artbob, Senior Java Developer, Stratoflow

No language feature fixes this one. Bills of materials, regular small updates and dependency scanning in the build keep it manageable; leaving dependencies untouched for five years makes it much worse.

Complicated generics

Generics let you write type-safe code that works with different types, and simple generics are fine. The corner cases are another matter: wildcards such as ? extends and ? super, and generics nested inside generics, can confuse even seasoned Java developers.

Simple generics are alright, but some of the corner cases are really quite hard to grasp. It's hard to figure out things like how there's a generic in a generic and how it's passed to a generic method that would also like to allow subclasses of that generic.

Wojciech Gdela, Senior Java Developer, Stratoflow

This one is mostly unchanged. Generics are as powerful, and as tricky, as they were.

Will Java remain popular?

How many times have we read that Java is about to share the fate of COBOL and fade into obscurity? One of our developers has been hearing it for a while:

I first heard questions about Java's demise even before 2010, when Clojure appeared. Since then, every now and then a new language comes along that is supposed to "completely transform the IT market," and yet these promises never materialize.

Artbob, Senior Java Developer, Stratoflow

The difference between Java and COBOL is that Java kept moving. Its systems are not museum pieces: Java runs many of the systems that cannot fail, from core banking, payments and insurance to airline and hotel search, logistics and the back ends of consumer platforms with hundreds of millions of users. And every six months the platform under those systems gets faster, safer and more pleasant to write. A language with the oldest installed base and one of the fastest release cadences is not on its way out.

The real gap is between Java and the Java people actually run. In JetBrains' 2025 survey, 31% of Java developers still work with Java 8 regularly (State of Java 2025), a release from 2014. The JDK itself can still be patched: Temurin 8 gets updates until at least 2030. The frameworks on top of it cannot, at least not for free: Spring Framework 5.3 left open-source support in August 2024.

That is why the next big wave in the Java world is not a new language. It is Java modernization: moving systems from Java 8 and 11 to a current LTS, with Spring and the rest of the stack upgraded along the way. It is usually far less work than people fear. We moved an online wine merchant's store and back office from Java 17 to Java 25 in about four weeks, without a feature freeze (case study), and our guide to legacy software systems covers what to watch out for on the way.

So, like it or not, Java will be with us for a long time. Perhaps the best summary of every rumor about its imminent death comes from Mark Twain:

The report of my death was an exaggeration.

Mark Twain

If your Java systems are a few releases behind, our application modernization team maps the versions and dependencies first, gives you a written ballpark, then upgrades the system in tested steps while your team keeps shipping.