JDK 1.3(对外称 Java 2 Platform, Standard Edition, v1.3,代号 Kestrel)于 2000 年 5 月 8 日发布,是 JDK 1.2 之后又一次以运行时为核心的升级——最重要的变化不在语言语法,而在 JVM 本身:HotSpot 从此成为默认 VM。命名与后续演变见 Java 版本历史。
版本号说明
| 维度 | JDK 1.3 |
|---|---|
| 对外名称 | Java 2 SE 1.3 / JDK 1.3 |
| 代号 | Kestrel |
java.version |
1.3.x |
| class major version | 47 |
| 上一版本 | JDK 1.2 |
| 下一版本 | JDK 1.4 |
概览
JVM:HotSpot 成为默认 VM
这是 1.3 最重要的变化。HotSpot 早在 1999 年 4 月就以独立产品 Java HotSpot Performance Engine 发布,可配合 JDK 1.2 使用,但当时不是默认项;JDK 1.3 起 HotSpot 成为默认 VM,旧的 Classic VM 仍可通过参数选用,直到 JDK 1.4 才被彻底移除。详见 HotSpot。
对使用者来说,这次切换意味着:
- JIT 编译从「因平台而异」的早期实现,变为 HotSpot 统一的 C1 / C2 编译体系(详见 HotSpot)
- 垃圾回收从非分代切换为分代:Classic VM 的固定标记-清除收集器被 HotSpot 的分代模型取代,Serial 收集器(新生代)+ Serial Old(老年代)成为此时事实上唯一的组合,直到 JDK 1.4 才出现 Parallel Scavenge(详见下文「垃圾回收」)
- 提供 Client 与 Server 两种模式(
-client/-server),分别面向启动速度/内存占用和峰值吞吐
类库
- JNDI(
javax.naming)从可选扩展并入核心 JDK,提供统一的命名与目录服务访问(LDAP、CORBA Naming、RMI Registry 等) - 动态代理(
java.lang.reflect.Proxy):运行时生成实现指定接口的代理类,是后续 AOP、RPC 框架的基础设施之一 - RMI-IIOP:RMI 新增对 CORBA IIOP 协议的可选兼容,Java 对象可与 CORBA 客户端互通
- Java Sound API(
javax.sound):音频采集、处理、回放与 MIDI 合成 java.awt.Robot:生成原生鼠标/键盘事件,主要用于 GUI 自动化测试
工具与诊断
- JPDA(Java Platform Debugger Architecture)从 1.3.x 起由 JDK 直接支持(此前的 1.2.2 只是先推出工具集),详见 Java 调试与 JPDA
1.3 尚未具备(后续版本才加入)
| 能力 | 大致引入版本 |
|---|---|
| Classic VM 彻底移除,HotSpot 成为唯一实现 | 1.4 |
assert、NIO、标准正则、Parallel Scavenge |
1.4 |
| 泛型、enum、for-each、JUC | 5 |
| Parallel Old、CMS 正式支持 | 1.5 / 1.6(见 Java GC) |
HotSpot 成为默认 VM
1.3 之前的 JDK(1.0~1.2)默认使用 Sun 自研的 Classic VM:以解释执行为主,各平台 JIT 实现不统一,GC 是固定的单线程标记-清除、不分代。HotSpot 首次发布于 1999 年 4 月,作为可选组件配合 JDK 1.2 使用;到了 1.3,Sun 直接把它设为默认 VM:
# JDK 1.3 起,不加参数默认走 HotSpot
java -version
# 仍可显式切回 Classic VM(1.4 起该参数被移除)
java -classic -version
HotSpot 带来的核心能力是自适应优化:解释执行起步,运行时持续探测热点方法,用 C1/C2 编译为本地代码,比 Classic VM「一刀切」的早期 JIT 更接近真实负载。完整历史见 HotSpot。
垃圾回收
HotSpot 取代 Classic VM,对 GC 是一次根本性的变化——不只是速度提升,而是分代模型第一次出现:
| 维度 | JDK 1.0~1.2(Classic VM) | JDK 1.3(HotSpot 默认) |
|---|---|---|
| 是否分代 | 否,整堆扫描 | 是,新生代 / 老年代 |
| 收集算法 | 固定标记-清除,不压缩 | 新生代复制算法 + 老年代标记-整理 |
| 可选收集器 | 0(无参数可切换) | Serial(新生代)+ Serial Old(老年代),此时无其他选择 |
| 执行方式 | 单线程、Stop-The-World | 单线程、Stop-The-World(Serial 本身仍是单线程收集器) |
也就是说,1.3 虽然让 GC「分代」了,但收集器本身依然只有一种组合——直到 JDK 1.4.1 才出现 Parallel Scavenge,JDK 1.4.2 才有 CMS。完整的收集器演进时间线见 Java GC(该表格「JDK 1.3.1 及以前」这一档,指的正是 HotSpot 默认化之后、Parallel Scavenge 出现之前的这段时期)。
JNDI 并入核心
1.3 之前 JNDI 是需要单独下载的扩展包;1.3 起 javax.naming 成为 JDK 标准库的一部分,为访问 LDAP、CORBA 命名服务、RMI Registry 等提供统一 API:
Context ctx = new InitialContext();
Object obj = ctx.lookup("java:comp/env/jdbc/myDataSource");
企业级应用(尤其后续 J2EE/EJB 场景)用它做资源查找,是这一时期「Java 走向服务端」的又一块拼图,与 JDK 1.1 引入的 JDBC、RMI 属于同一条线。
动态代理
java.lang.reflect.Proxy 允许运行时为一组接口生成代理类,方法调用统一转发给 InvocationHandler:
Object proxy = Proxy.newProxyInstance(
MyService.class.getClassLoader(),
new Class<?>[] { MyService.class },
(proxyObj, method, args) -> {
System.out.println("before: " + method.getName());
return method.invoke(target, args);
}
);
这是后续 AOP 框架(如 Spring 的 JDK 动态代理)、RPC 客户端 stub 生成的基础能力之一;只能代理接口,代理具体类需要 CGLIB 等字节码生成方案。
历史背景(简述)
2000 年距 JDK 1.2(1998 年底,集合框架、Swing、「Java 2」品牌)约一年半。1.3 没有语法层面的大动作,重心全部放在运行时质量上——HotSpot 默认化、JNDI 并入核心,都是为随后几年 J2EE、Spring 等服务端生态的爆发做准备。平台命名、发布节奏见 Java 版本历史。
与上一版本的衔接
| 主题 | JDK 1.2 | JDK 1.3 |
|---|---|---|
| 默认 VM | Classic VM(HotSpot 发布 4 个月后可选配,但非默认) | HotSpot(Classic 仍可选) |
| GC 模型 | 不分代,固定标记-清除 | 分代,Serial + Serial Old |
| 命名服务 | 无标准 API | JNDI(并入核心) |
| 代理/AOP 基础 | 无 | java.lang.reflect.Proxy |
| RMI / CORBA | Java IDL(ORB),尚无 RMI-IIOP | RMI 可选兼容 CORBA IIOP |
| GUI 自动化 | 无标准 API | java.awt.Robot |
更完整的 1.2 基线见 JDK 1.2;下一版本见 JDK 1.4。
参考
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-07-15 | url 改为 jdk-1-3 |
URL 含 . 时 Cloudflare 误判 MIME,页面无法打开 |