Skip to content

Java & JVM 历史重大事件

时间线总览

1995 ──────► 2004 ──────► 2014 ──────► 2017 ──────► 2021 ──────► 2023 ──────► 未来
  │           │           │           │           │           │
Java 1.0    Java 5     Java 8     Java 9      Java 17    Java 21
发布      革命性更新    闭包/Stream    模块化     LTS 重启    虚拟线程

1995:Java 诞生

1995 年 5 月 23 日,Sun 公司正式发布了 Java 1.0。首批杀手级特性:

  • Applet:在浏览器里跑 Java 程序(后来凉了)
  • 跨平台:Write Once, Run Anywhere
  • 垃圾回收:不用手动管理内存(当时看起来很激进)

Java 的最初目标是消费电子设备(微波炉、洗衣机……),后来发现用在 Web 上更合适。James Gosling 可能也没想到,这个为微波炉设计的语言,后来统治了企业级开发。

有意思的是,Java 最初的名字是 "Green",它用的虚拟机叫 "Keystone"。后来改名 Java,一是因为 "Green" 已被注册,二是因为 Java(爪哇)是印度尼西亚的一种咖啡的名字。

1996~1998:奠基期

  • 1996:JDK 1.0.2 发布,被称为「Java 1」
  • 1997:JDK 1.1 发布,引入内部类、JDBC、RMI
  • 1998:J2SE 1.2 发布,Java 正式分为 J2SE(标准版)、J2EE(企业版)、J2ME(微缩版)

这个阶段奠定了 Java 作为企业开发语言的基础。

2000:J2SE 1.3 — HotSpot 的加入

JDK 1.3 最大的变化是引入了 HotSpot 虚拟机

HotSpot 由 Longview Technologies 开发,1999 年被 Sun 收购。HotSpot 名字的由来是它的一个核心特性:热点代码探测。它会监控哪些代码被执行得最频繁,优先对这些「热点」代码进行 JIT 编译优化。

HotSpot 是目前使用最广泛的 JVM,至今仍是 Oracle JDK 和 OpenJDK 的核心。直到今天我们说的「JVM 调优」,本质上都是调 HotSpot。

2004:Java 5 — 革命性的一代

Java 5 是 Java 历史上变化最大的版本,没有之一。

革命性的新特性

特性影响
泛型List<String> 不再需要强制类型转换,类型安全大幅提升
注解(Annotation)框架时代的奠基石,Spring、Hibernate 全部依赖注解
自动装箱/拆箱intInteger 自动转换,写代码更简洁
枚举(enum)类型安全的枚举,不再用整型常量代替
可变参数String... args 让方法签名更灵活
for-each 循环for (String s : list) 替代 Iterator
并发包(J.U.C)ConcurrentHashMapExecutorService……并发编程门槛大幅降低
可变数量参数Varargs,让方法接受任意数量的参数
静态导入import static 简化工具类的使用
元编程(APT)注解处理器,允许在编译期生成代码

JVM 层面的变化

  • 类文件格式版本从 49.0 升到 50.0
  • 新增 java.lang.instrument 包,支持 Java Agent
  • 泛型的引入改变了字节码的生成方式(类型擦除)
  • 五代 GC(Serial、ParNew、CMS、ParallelGC、G1)逐步成熟

2014:Java 8 — 另一个里程碑

Java 8 是目前生产环境中使用最广泛的版本,也是很多公司还没升级到的「天花板」。

Lambda 表达式:函数式编程入门

java
// Java 7:匿名内部类
list.sort(new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.compareTo(b);
    }
});

// Java 8:Lambda 表达式
list.sort((a, b) -> a.compareTo(b));

// Java 8:方法引用(更简洁)
list.sort(String::compareTo);

Lambda 不仅仅是语法糖。它让 Java 从纯面向对象语言,蜕变成支持函数式编程的语言。这改变了很多 API 的设计方式(Stream API 就是最好的例子)。

Stream API:集合操作的新方式

java
List<String> names = users.stream()
    .filter(u -> u.getAge() > 18)
    .map(User::getName)
    .sorted()
    .collect(Collectors.toList());

这段代码声明式地描述了「过滤-映射-排序-收集」的操作,底层仍然是 JVM 的循环,但代码可读性大幅提升。

新日期时间 API

java.util.Date 是 Java 设计败笔之一,Java 8 终于引入了 java.time 包(借鉴 Joda-Time),设计合理、线程安全。

JVM 的变化

  • Metaspace 取代 PermGen:方法区从堆内存移到了本地内存,解决了「永久代OOM"」的问题
  • HashMap 实现变化:JDK 8 后变成了「数组+链表+红黑树」,解决了哈希冲突时的性能退化
  • ** invokedynamic 指令**:原本为 JRuby 等动态语言设计,后来被 Lambda 表达式使用

2017:Java 9 — 模块化时代

Java 9 引入了 Jigsaw 模块化系统,这是 Java 历史上第三个「革命性」版本。

模块化(Project Jigsaw)

java
// module-info.java
module com.myapp {
    requires com.fasterxml.jackson.core;
    exports com.myapp.service;
}

模块化让 Java 应用可以声明依赖关系,避免「类路径地狱」,也让 JDK 本身被模块化了。你现在可以在启动时指定只用哪些模块,大幅减少 Docker 镜像体积。

其他重要变化

  • JShell:交互式 REPL,命令行里可以直接敲 Java 代码,不用写完整文件
  • 接口可以写私有方法:解决了默认方法复用的问题
  • Stream 新增方法takeWhiledropWhileofNullable
  • HTTP Client API:终于有了官方的 HTTP/2 客户端(之前只能用 Apache HttpClient)

2018~2020:加速迭代的几年

Oracle 调整了发布节奏,每 6 个月发布一个新版本:

  • Java 10(2018.3):局部变量类型推断 var
  • Java 11(2018.9):移除 Java EE 和 CORBA 模块、新增 HttpClient 正式版、ZGC 正式版
  • Java 12~16:引入了 Switch 表达式、文本块(Text Blocks)、Records、密封类(Sealed Classes)等
  • Java 14~16:正式告别了 Java 8 时代的 Applet API

这个阶段是 Java 现代化速度最快的几年。

2021:Java 17 LTS — 新秩序

Java 17 是一个重要的 LTS(长期支持)版本,也是 Oracle 更换许可证后的第一个免费 LTS。

重大新特性

  • 密封类(Sealed Classes)sealed class 让你精确控制哪些类可以继承你
  • Switch 表达式(正式)yield 关键字让 Switch 有了返回值
  • Records(正式)record Point(int x, int y) {} 自动生成 equals/hashCode/toString/getter
  • 移除 Applet API
  • 更强的随机数生成器

从 Java 17 开始,Oracle JDK 在生产环境使用不再免费(除非用 OpenJDK),这促使更多人转向 Amazon Corretto、Azul Zulu、Eclipse Temurin 等免费发行版。

2023~未来:虚拟线程引领新时代

Java 21(2023.9)— 虚拟线程

Project Loom 终于落地,虚拟线程(Virtual Threads)是 Java 历史上最重大的变化之一。

java
// 一个虚拟线程
Thread virtualThread = Thread.ofVirtual()
    .start(() -> System.out.println("Running in virtual thread"));

虚拟线程解决了传统线程的「昂贵」问题:过去一个线程占用 1MB 栈内存,一台服务器撑死开几千个线程;虚拟线程的栈是按需分配的,开几十万个都不是问题。

这改变了高并发编程的范式:不需要池化、不需要协程框架,用普通的多线程写法就能达到极高的吞吐。

Java 22~23 持续进化

  • String Templates(预览)"Hello ${name}" 模板字符串
  • Unnamed Variables(正式):_ 替代不使用的变量
  • Foreign Function & Memory API(正式):在纯 Java 中调用本地代码和操作堆外内存

回顾:JVM 的成长轨迹

1995  虚拟机概念诞生,解释执行
1999  HotSpot 加入,开始 JIT 编译
2004  Java 5,泛型、注解、并发包
2014  Java 8,lambda、stream、metaspace
2017  Java 9,模块化系统
2021  Java 17,现代化语言特性
2023  Java 21,虚拟线程

JVM 从一个简单的解释器,成长为今天这个支持多语言、高性能、自动内存管理的成熟运行时。它的设计哲学始终是:让开发者专注于业务逻辑,把底层脏活交给虚拟机

下一节,我们来系统了解一下 虚拟机与 Java 虚拟机介绍,到底什么是虚拟机,Java 虚拟机又是什么。

基于 VitePress 构建