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 全部依赖注解 |
| 自动装箱/拆箱 | int 和 Integer 自动转换,写代码更简洁 |
| 枚举(enum) | 类型安全的枚举,不再用整型常量代替 |
| 可变参数 | String... args 让方法签名更灵活 |
| for-each 循环 | for (String s : list) 替代 Iterator |
| 并发包(J.U.C) | ConcurrentHashMap、ExecutorService……并发编程门槛大幅降低 |
| 可变数量参数 | 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 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:集合操作的新方式
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)
// module-info.java
module com.myapp {
requires com.fasterxml.jackson.core;
exports com.myapp.service;
}模块化让 Java 应用可以声明依赖关系,避免「类路径地狱」,也让 JDK 本身被模块化了。你现在可以在启动时指定只用哪些模块,大幅减少 Docker 镜像体积。
其他重要变化
- JShell:交互式 REPL,命令行里可以直接敲 Java 代码,不用写完整文件
- 接口可以写私有方法:解决了默认方法复用的问题
- Stream 新增方法:
takeWhile、dropWhile、ofNullable - 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 时代的
AppletAPI
这个阶段是 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 历史上最重大的变化之一。
// 一个虚拟线程
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 虚拟机又是什么。
