JDK 1.4(J2SE 1.4)于 2002 年 2 月发布。对外称 Java 2 Platform, Standard Edition 1.4;命名体系与后续演变见 Java 版本历史。

1.4 GA 后,下一代 Tiger(JDK 5) 的语言特性即在 JCP 并行规划——含 JSR 175 注解(2002 年 3 月立项),并非等 1.4 维护多年后才起步。详见 JDK 5 §发布历程。

注意:jdk14.md 记录的是 JDK 14(2020),与本文的 JDK 1.4 不是同一版本。

版本号说明

维度 JDK 1.4
平台品牌 J2SE 1.4
java.version 1.4.2_19 等
class major version 48
下一版本 JDK 5

完整命名演变见 Java 版本历史。

概览

语言

类库

JVM 与性能

  • HotSpot 成为唯一 VM(1.4.0 起移除 Classic VM;HotSpot 自 JDK 1.3 起已是默认实现,见 HotSpot)
  • Parallel Scavenge 新生代收集器(1.4.0);1.4.1 起 GC 调优选项增强(见 Java GC)
  • 1.4.2 引入自旋锁(-XX:+UseSpinning,见 Java Lock)

工具与诊断

  • JPDA(Java Platform Debugger Architecture)架构完善

assert 断言

JDK 1.4 在语言层新增 assert 关键字,用于开发/测试阶段的条件检查;默认关闭,生产环境通常不启用。语法、-ea / -da 运行参数及设计取舍详见 Java assertion。

assert value >= 0 : "value must be non-negative: " + value;

编译需 -source 1.4;老版本 JDK 无法识别 assert 关键字。


正则表达式(java.util.regex)

JDK 1.4 之前 Java 无标准正则 API,需依赖第三方库。1.4 起内置 Pattern / Matcher:

Pattern p = Pattern.compile("[A-Z0-9]{10}");
boolean ok = p.matcher("ABC1234567").matches();

入门与常用语法见 Java 正则表达式。


NIO(New I/O)

java.nio 提供面向 Buffer / Channel 的 I/O 模型,支持非阻塞 I/O 与多路复用(Selector),是对传统 InputStream / OutputStream 的补充。

组件 作用
Buffer 内存缓冲区(ByteBuffer 等)
Channel 与 Buffer 配合的 I/O 通道
Selector 多路复用,支撑 NIO 服务器
MappedByteBuffer 内存映射文件,可替代部分 RandomAccessFile 场景

NIO 文件路径 API(java.nio.file)要到 JDK 7 才引入(NIO.2)。


java.util.logging

JDK 1.4 内置 JUL(Java Util Logging),提供标准日志 API。许多项目后来选用 Log4j、SLF4J 等;与 JUL 的桥接、选型讨论见 commons-logging 与 log4j。

Logger logger = Logger.getLogger("com.example");
logger.info("hello");

URI 与 URL

JDK 1.4 起 java.net.URI 与 URL 职责分离:URI 表语法结构,URL 是含定位信息的 URI 特例。详见 Java URL URI。


链式异常

异常可通过 initCause() 关联根因,改善早期 Java 异常栈信息不足的问题:

try {
    // ...
} catch (IOException ex) {
    throw new RuntimeException("read failed", ex); // JDK 1.4 起支持 cause 链
}

与 JDK 5 的衔接

JDK 1.4 尚无泛型、增强 for 循环、自动装箱、enum、变长参数等语法——这些均在 JDK 5 引入。JDK 5 文档中的 JDK 1.4 对比示例(下标 for、Iterator + raw type)可作为理解语法演进的参考。


GC 组合速查

JDK 1.4 先后引入了 Parallel Scavenge(1.4.0)和 CMS、ParNew(1.4.2,均为实验特性),到 1.4 系列结束时,可用的新生代 + 老年代组合如下(详见 Java GC):

新生代收集器 老年代收集器 启用参数 说明
Serial Serial Old -XX:+UseSerialGC 自 JDK 1.3.1 及以前就是唯一选择,1.4 中仍可用
Parallel Scavenge Serial Old -XX:+UseParallelGC 1.4.0 引入;此时 Parallel Old 还未出现(JDK 1.6 才有),且 Parallel Scavenge 无法与 CMS 配合,老年代只能选 Serial Old
ParNew CMS -XX:+UseParNewGC 搭配 -XX:+UseConcMarkSweepGC 1.4.2 随 CMS 一起以实验特性引入;ParNew 是 Serial 的多线程版本,存在的主要目的就是配合 CMS 收集新生代
ParNew Serial Old(后备) (Concurrent Mode Failure 时自动切换) 非正常配置,是 CMS 并发失败时的后备预案,停顿时间会明显变长

ParNew 是新生代收集器,本身不属于 CMS 的一部分;但因为 Parallel Scavenge 无法与 CMS 搭配,ParNew 事实上是当时唯一能配合 CMS 工作的并行新生代收集器,所以两者常被一起提及。


参考

维护记录

时间 修改内容 原因
2026-06-21 修正 HotSpot 表述:1.3 默认、1.4 移除 Classic VM 与 hotspot.md、java-version-history 对齐
2026-06-24 首段补充 Tiger / JSR 175 与 1.4 的时间衔接;链到 jdk-5.md 厘清 1.4 与 JDK 5 规划并行关系
2026-06-24 首段补充 Tiger / JSR 175 与 1.4 的衔接;链到 jdk-5.md 厘清 1.4 与 JDK 5 规划时间线
2026-07-14 新增「GC 组合速查」章节,补充可用新生代/老年代收集器组合表格 说明 ParNew 作为新生代收集器的配套老年代收集器
2026-07-15 url 改为 jdk-1-4 URL 含 . 时 Cloudflare 误判 MIME,页面无法打开