Java is one of the few programming languages whose history intersects with several major shifts in computing: consumer electronics, the rise of the Web, enterprise software, open source, smartphones, and cloud computing.
When Java reached the public in 1995, its promise was summarized by a memorable slogan: “Write Once, Run Anywhere.” The idea was that developers could compile a program once and run it on different systems through a common execution platform. Java turned that promise into a practical ecosystem built around bytecode, the Java Virtual Machine (JVM), automatic memory management, and a broad standard library.
Yet Java was not originally designed for the Web. Its story began several years earlier with a small team at Sun Microsystems exploring the future of consumer devices.
1991: Project Green
In the early 1990s, Sun Microsystems was best known for Unix workstations and networked computing. Some engineers believed, however, that the next wave would also involve intelligent consumer devices: interactive televisions, set-top boxes, handheld systems, and home electronics.
In 1991, Sun created the Green Project to explore that future.
One of its engineers was James Gosling, who would become the central designer of the new language.
The team faced a difficult constraint: consumer devices could use very different processors and operating environments. Maintaining a separate software version for every hardware platform would be expensive and fragile.
Portability therefore became a design requirement from the beginning.
Oak: Java before Java
Gosling initially experimented with C and C++.
C++ provided powerful abstractions and excellent control over resources, but the Green team wanted a simpler and more controlled environment for software that might need to run on many different devices.
Gosling created a new language called Oak, reportedly named after an oak tree outside his office.
Oak kept a syntax familiar to C and C++ developers while removing or restricting several mechanisms that could make programs harder to manage. Memory would be reclaimed automatically through garbage collection, and programmers would not use explicit pointer arithmetic as they did in C.
The goal was not merely portability. The language also aimed to make large programs easier to maintain and less vulnerable to certain classes of low-level errors.
Bytecode and the Java Virtual Machine
Java’s most important architectural decision was its execution model.
Java source code is normally compiled not directly into the machine instructions of one processor, but into an intermediate representation called Java bytecode.
That bytecode is executed by a Java Virtual Machine, or JVM.
If a platform provides a compatible JVM, the same compiled bytecode can in principle run there.
Instead of porting every application to every processor and operating system, the JVM itself becomes the portability layer.
This model gave meaning to the slogan:
Write Once, Run Anywhere.
Perfect portability has always depended on libraries, operating-system integration, and implementation details, but the JVM dramatically reduced the amount of platform-specific work required for many applications.
From consumer electronics to the Web
Project Green did not achieve the expected commercial breakthrough in interactive television.
At almost the same time, however, the World Wide Web was expanding rapidly.
Sun realized that a language designed to move between heterogeneous devices might also be valuable on a network connecting heterogeneous computers.
The name Oak could not be kept because of trademark issues. After considering alternatives, the team adopted Java.
Sun publicly introduced Java in 1995.
The timing was exceptional. The Web was becoming a mass phenomenon, and developers were searching for ways to move beyond static pages.
HotJava and the age of applets
Sun created HotJava, a browser able to execute small Java programs embedded in Web pages.
These programs were called applets.
At the time, applets looked revolutionary. A Web page could contain animations, interactive interfaces, visualizations, or games executed on the user’s computer.
Netscape soon added Java support to its browser, giving the language enormous exposure.
Applets became one of the symbols of the 1990s Web.
Ironically, they would not become Java’s lasting success.
Java is not JavaScript
The similarity of their names still causes confusion, but Java and JavaScript are separate languages.
JavaScript was created in 1995 by Brendan Eich at Netscape as a lightweight scripting language for browsers.
The JavaScript name was strongly influenced by the commercial context of a period when Java was receiving enormous attention.
Historically, the languages occupied different roles. Java became especially important for applications, servers, and enterprise systems. JavaScript became the native programming language of the browser and later expanded to servers and many other environments.
Java 1.0: a platform, not just a syntax
In January 1996, Sun released the Java Development Kit 1.0.
Java was already more than a programming language. The platform included the compiler, the JVM, a standard library, development tools, security mechanisms, and dynamic class loading.
This platform approach became one of Java’s defining strengths.
Developers could rely on common APIs for networking, input/output, collections, graphical interfaces, threading, and many other tasks.
The ecosystem grew around a shared execution environment rather than around syntax alone.
Classes and objects became the main organizational units of programs. Encapsulation, inheritance, interfaces, and polymorphism were central to the language and its early APIs.
Compared with C++, Java deliberately simplified several mechanisms.
It avoided multiple inheritance of classes, automated memory reclamation, and removed explicit pointer arithmetic.
These choices helped make Java attractive to teams building large applications that had to remain understandable and maintainable for many years.
Java 2 and the enterprise era
Java 1.2, released in 1998, marked a major expansion. Sun began using the Java 2 name and organized the platform into several editions.
J2SE covered general-purpose desktop and server development.
J2EE targeted enterprise and distributed server applications.
J2ME addressed constrained devices such as early mobile phones and embedded systems.
J2EE was particularly important to Java’s long-term success.
Servlets, JavaServer Pages, Enterprise JavaBeans, database APIs, messaging systems, and application servers created a standardized environment for large business systems.
Java became common in banks, insurance companies, telecommunications, government, and large corporate information systems.
Why enterprises adopted Java
Java’s enterprise success came from a combination of factors.
Portability reduced dependence on a particular operating system.
Static typing caught many mistakes before deployment.
Garbage collection eliminated a significant amount of manual memory management.
The JVM offered a controlled runtime.
Libraries and frameworks multiplied rapidly.
A large community and labor market made it easier to build and maintain development teams.
For organizations expecting software to remain in production for ten or twenty years, stability and compatibility mattered as much as fashionable syntax.
The JVM gets faster
Early Java implementations were often criticized for poor performance.
Running bytecode inside a virtual machine appeared inherently slower than executing native machine code.
The JVM, however, became increasingly sophisticated.
Just-In-Time (JIT) compilers identify frequently executed code and compile it into optimized native instructions while the program is running.
A runtime compiler can also observe the program’s real behavior and optimize paths that are actually used.
HotSpot, a virtual machine technology acquired by Sun and integrated into Java, became a central part of this performance story.
Over time, Java moved from being dismissed as “too slow” for serious workloads to powering some of the world’s largest server systems.
The decline of applets
While Java expanded on servers, applets moved in the opposite direction.
They required browser plugins or local Java installations, could be slow to start, and introduced complicated security and deployment issues.
Meanwhile, browsers themselves became more capable.
JavaScript, CSS, HTML, and modern Web APIs gradually provided rich interfaces without requiring a Java plugin.
Browser vendors eventually removed support for the old plugin technologies.
Applets disappeared.
Java survived because its server and enterprise ecosystem had become far more important than its original browser showcase.
Java 5 modernizes the language
Released in 2004, Java 5 introduced several major language improvements:
generics;
annotations;
enumerations;
autoboxing;
enhanced for loops;
variable-argument methods.
Generics improved type safety in collections and reusable APIs.
Annotations became especially influential because frameworks could use metadata directly attached to classes, methods, and fields.
Java was learning to evolve without abandoning the compatibility that had become one of its greatest assets.
Frameworks reshape Java development
Java’s history cannot be told only through language versions.
Frameworks changed how developers built applications.
Apache Tomcat became a widely used servlet container.
Hibernate popularized object-relational mapping.
Spring offered a lighter alternative to some heavyweight enterprise patterns and made dependency injection mainstream in Java development.
Later, Spring Boot dramatically simplified the creation of standalone services and Web applications.
Build tools such as Maven and Gradle, testing libraries, monitoring tools, and package repositories became equally important parts of the Java experience.
IDEs and industrial-scale tooling
Java also benefited from unusually strong development environments.
Eclipse, originally connected to IBM, became a major open-source IDE.
IntelliJ IDEA pushed code analysis, navigation, and automated refactoring to a high level.
NetBeans, long associated with Sun, also played an important role.
For large codebases, these tools matter enormously. They allow developers to navigate millions of lines of code, safely rename or restructure components, and detect problems before execution.
Java’s tooling became part of its competitive advantage.
OpenJDK: opening the platform
For its first decade, Java was closely associated with Sun Microsystems.
In 2006, Sun announced that major parts of Java would be released as open source.
OpenJDK became the open-source reference implementation of the Java platform.
This changed the ecosystem.
Java was no longer simply a technology delivered by one vendor. Multiple companies and communities could collaborate on the runtime, build distributions, and participate in its evolution.
OpenJDK later became the foundation of most mainstream Java distributions.
Oracle acquires Sun
Oracle completed its acquisition of Sun Microsystems in 2010.
Java therefore entered a new institutional era.
The transition created debate about governance, licensing, and the future of the platform.
Over time, however, OpenJDK became increasingly central.
Oracle, Red Hat, IBM, Amazon, Microsoft, and other organizations now contribute to or distribute Java runtimes based on OpenJDK.
The ecosystem is therefore broader than any single commercial distribution.
Android and Java
Java also became deeply associated with Android.
Early Android application development used Java as its primary language.
Android did not simply run applications on a standard Java SE JVM. Google created its own runtime architecture, first Dalvik and later ART.
The use of Java APIs contributed to a long legal dispute between Oracle and Google.
Despite those differences, Java became the language learned by an entire generation of Android developers.
Kotlin later gained official support and became preferred for many new Android projects, but a huge amount of Java code remains in the ecosystem.
Java 8: lambdas and streams
Released in 2014, Java 8 was one of the most important modern versions.
It introduced lambda expressions and the Stream API.
Lambdas made it possible to express behavior far more concisely than with the anonymous inner classes commonly used before.
Streams provided a declarative model for filtering, transforming, and aggregating sequences of data.
Java was incorporating functional-programming ideas while retaining its object-oriented foundations.
Java 8 remained a dominant production version for many years.
The JVM becomes multilingual
The JVM eventually became a platform for languages other than Java.
Scala combines object-oriented and functional programming.
Clojure brings a Lisp-inspired approach.
Groovy offers a dynamic language closely integrated with Java libraries.
Kotlin, created by JetBrains, provides modern syntax while maintaining strong Java interoperability.
This is an important part of Java’s legacy: even code not written in Java can benefit from the JVM’s garbage collectors, JIT compilers, libraries, monitoring tools, and mature runtime infrastructure.
Faster release cycles and modern Java
Beginning in 2017, Java moved toward a regular release cadence.
Instead of waiting several years for major releases, new feature versions arrive frequently, while selected releases receive long-term support from various vendors.
Modern Java has added features such as:
the module system;
local variable type inference with var;
records;
text blocks;
pattern matching;
sealed classes;
virtual threads.
These changes aim to reduce historical verbosity and address modern workloads without breaking the enormous amount of existing Java software.
Virtual threads and modern concurrency
Concurrency has always mattered in Java server applications.
Traditional operating-system threads are relatively expensive resources.
Project Loom introduced virtual threads, allowing applications to create very large numbers of lightweight concurrent tasks while retaining a familiar blocking programming style.
This is especially useful for services that spend much of their time waiting for databases, networks, or other I/O.
Virtual threads illustrate Java’s preferred style of evolution: modernize the runtime while preserving programming models that existing developers can understand.
Java compared with Python, JavaScript, and C++
Java occupies a different space from several other major languages.
Python emphasizes concise syntax and rapid development and has become central to automation, data science, and AI.
JavaScript dominates browser programming and has expanded far beyond the browser.
C++ offers more direct control over memory and machine resources, which remains essential for engines, systems software, and many performance-critical applications.
Java seeks a compromise between performance, portability, runtime safety, developer productivity, and long-term stability.
The languages are not interchangeable; they optimize for different constraints.
Why Java still matters
Java is now more than three decades old, yet it remains widely used.
Compatibility is a major reason. Organizations can often move old applications to newer JVMs without rewriting them completely.
Modern JVMs also provide sophisticated garbage collectors, highly optimized JIT compilers, profiling, diagnostics, and observability.
The ecosystem is enormous, from frameworks and testing tools to build systems and cloud services.
Most importantly, Java is deeply embedded in sectors where software lives for decades rather than months.
That installed base creates inertia, but it also reflects genuine technical and organizational value.
Criticism and adaptation
Java has long been criticized for verbosity, memory consumption, startup time, and the complexity created by decades of compatibility.
Newer languages sometimes offer more expressive syntax or stronger type-system features.
Java has responded gradually rather than through a complete redesign.
Records reduce boilerplate for data-oriented classes.
Pattern matching makes type-oriented logic more concise.
Modern garbage collectors reduce latency.
Frameworks such as Quarkus and Micronaut address cloud and container workloads.
GraalVM and native-image technologies explore different deployment models.
Java continues to change because the environment around it keeps changing.
From Oak to global infrastructure
Java’s history is striking because several of the technologies that first made it famous did not last.
Interactive television was not its breakthrough.
Applets disappeared.
Sun Microsystems ceased to exist as an independent company.
Java nevertheless survived and expanded.
Its deeper foundations - portability, a virtual machine, managed memory, shared libraries, compatibility, and a huge ecosystem - proved useful in contexts its original designers could not fully anticipate.
Java evolved from a language for heterogeneous consumer devices into a global software platform.
Key takeaways
Java began in Sun Microsystems’ Green Project in 1991. James Gosling first created Oak for software that needed to run across different hardware.
Renamed Java, the language was publicly introduced in 1995 and gained enormous visibility through Web applets.
Its lasting innovation was not the applet but the combination of bytecode and the JVM, which moved much of the portability problem into the runtime platform.
From the late 1990s onward, Java became especially important on servers and in enterprise systems.
Java 5 modernized the language, Java 8 introduced lambdas and streams, and OpenJDK transformed Java into a broadly shared open-source infrastructure.
Today, the JVM hosts several languages and Java continues to evolve through regular releases, modern language features, and runtime innovations such as virtual threads.
Java’s history demonstrates a recurring lesson in computing: a technology can outlive its original use case when its underlying architecture proves useful in entirely new environments.
Frequently asked questions
Who created Java?
Java was primarily designed by James Gosling and a team at Sun Microsystems as part of Project Green in the early 1990s.
What was Java originally called?
The language was first called Oak before being renamed Java.
Why is Java portable?
Java is normally compiled into bytecode, which is executed by a compatible JVM on each platform.
Are Java and JavaScript related?
No. They are separate languages with different histories and execution models.
Are Java applets still used?
They have effectively disappeared because modern browsers no longer support the plugin model required to run them.
What is OpenJDK?
OpenJDK is the open-source reference implementation of the Java platform and the foundation of many current Java distributions.
Is Java still used today?
Yes. It remains common in enterprise systems, backend services, finance, distributed infrastructure, and long-lived software platforms.
What is the difference between Java and the JVM?
Java is a programming language. The JVM is an execution environment for bytecode and can also host languages such as Kotlin, Scala, and Clojure.
Why has Java lasted so long?
Portability, compatibility, mature tooling, the JVM, a huge ecosystem, and massive enterprise adoption have made Java unusually durable.