JDK 版本演进及主要特性

本文记录JDK版本演进历史及各版本主要特性。


JDK 1.0

1996年1月发布,主要特性:

  • Classic VM,虚拟机
  • Applet,Java小程序
  • AWT图形设计

JDK 1.1

1997年2月发布,主要特性:

  • AWT事件模型大规模重新编制
  • Inner Class
  • JavaBeans
  • JDBC
  • RMI
  • Reflection
  • 针对Windows版本附带由Symantec为JavaSoft生产的JIT编译器
  • 支持国际化和Unicode

J2SE 1.2

1998年12月发布,主要特性:

  • J2SE、J2EE、J2ME
  • EJB
  • Java IDL,平台对象请求代理体系结构
  • 集合框架
  • strictfp关键字
  • 首次为Sun提供的JVM配备JIT编译器
  • 数字签名
  • JFC(Java Foundation Classes),包括Swing1.0、拖放及Java2D类库
  • Java Plug-In运行插件
  • JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
  • Applet中添加声音支持
  • 字符串常量做内存映射
  • 控制授权,访问系统资源的策略工具

HotSpot虚拟机

1999年4月27日发布,作为J2SE 1.2的附加程序,后来成为J2SE 1.3及之后版本的默认虚拟机。


J2SE 1.3

2000年5月发布,主要特性:

  • Timer API
  • 主程序库中合入JNDI(Java Naming and Directory Interface,Java命名和目录接口)
  • Java Sound API
  • 为了支持与CORBA的选择兼容性而修改了RMI
  • JPDA(Java Platform Debugger Architecture)

J2SE 1.4

2002年2月发布,第一个在JCP下开发的Java平台,Java计算能力有了大幅提升,主要特性:

  • assert断言关键字,JSR 41
  • Java打印服务
  • Logging API,JSR 47
  • Java Web Start,JSR 56
  • JDBC 3.0 API
  • Preferences API
  • 链式异常处理,允许一个异常封装原先处于较低级别的异常
  • 支持IPv6
  • 正则表达式,仿照Perl
  • Image I/O API,支持JPEG、PNG格式
  • NIO(Nonblocking Input/Output,非阻塞I/O),JSR 51
  • 集成了XML解析器和XSLT处理器(JAXP),JSR 5 & JSR 63
  • 集成安全和加密扩展组件(JCE,JSSE,JAAS)
  • 首选项APIjava.util.prefs

J2SE 5.0

2004年9月发布,Java里程碑版本,为标识该版本的重要性,从这个版本对外不再使用1.x的版本号命名规则,主要特性:

  • 泛型(Generics),为集合提供编译期间(静态)类型安全,且不需为大多数类型转换,JSR 14
  • 增强for循环,JSR 201
  • 自动装箱和自动拆箱,包装类型包括:IntegerDoubleFloatLongShortCharacterBoolean,JSR 201
  • 类型安全的枚举(Enumerations),JSR 201
  • 可变长度参数
  • 静态引入import static
  • 元数据,注解,JSR 175
  • 线程并发库java.util.concurrent

Java SE 6

2006年12月发布,Java的各种版本重新更名,J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME,主要特性:

  • java.awt新增Desktop类和SystemTray
  • JDBC 4.0,JSR 221
  • 升级JAXB到2.0版本,包括集成STAX解析器,处理XML文档的API
  • 轻量级HTTP Server API
  • 插入式注解(pluggable annotations)处理API,lombok基于该特性实现,JSR 269
  • Compiler API
  • 对脚本语言的支持(Ruby/Groovy/JavaScript),JSR 223
  • Java编译器API,允许Java程序以写程序的方式选择和调用Java编译器API,JSR 199

Java SE 7

2011年7月发布,主要特性:

  • switch支持String字符串类型
  • try-with-resources,资源自动关闭
  • 整数类型能够用二进制表示
  • 允许在数值字面值中加入下划线
  • 泛型实例化类型自动推断(<>
  • catch捕获多个异常类型,用|分隔
  • 全新的NIO 2.0 API
  • Fork&Join并行执行任务框架
  • 简化了varargs方法的声明
  • JVM本身对动态语言的支持,新的invokedynamic字节码指令(JSR 292),多语言虚拟机(Multi Language Virtual Machine)原型
  • 64位指针压缩,可以使用XX:+UseCompressedOops开启
  • JSR 166下的并发使用工具
  • 新的文件I/O程序库(JSR 203)增加多重文件的支持、文件原始资料和符号链接,新包:java.nio.filejava.nio.file.attributejava.nio.file.spi
  • 使用Timsort为集合与数组排序,取代归并排序
  • 对椭圆曲线加密算法增加标准库级别支持
  • 增强对新网络通信协议(包括SCTP和Sockets Direct Protocol)的标准库级别的支持
  • 更新对XML和Unicode的支持,以符合最新标准

Java SE 8 LTS

2014年3月发布,主要特性:

  • JSR 335,JEP 126:Lambda项目中提供的语言级匿名函数支持(官方称为Lambda表达式,非官方亦称为闭包
  • JSR 223,JEP 174:Nashorn项目,一个JavaScript运行时,允许开发人员在应用程序中嵌入JavaScript代码
  • JSR 308,JEP 104:在Java类型上的注解
  • JSR 337,JEP 120:重复注解Repeatable
  • JSR 310,JEP 150:日期和时间API,基于Joda-Time日期时间处理库的实现
  • JEP 178:静态连接JNI程序库
  • JEP 153:执行JavaFX应用程序(直接执行JavaFX的应用程序的JAR包)
  • JEP 122:移除了虚拟机内存管理中的永久世代,使用元空间Metaspace代替
  • 无符号整数算术
  • 函数式接口
  • 方法引用
  • 接口默认方法
  • Stream API
  • Optional解决NullPointerException
  • Base64

Java SE 9

2017年9月发布,非LTS版本,OpenJDK于2018年3月停止更新,主要特性:

  • JSR 376:在Jigsaw项目中将JDK模块化
  • JEP 222:JShell
  • JEP 295:AOT编译(通过Graal VM实现)
  • JEP 268:XML Catalogs
  • JEP 266:更多的并发更新,包含响应式流的Java实现,及其部分替代品java.util.concurrent.Flow
  • JEP 193:变量句柄,定义一个标准方法来调用java.util.concurrent.atomicsun.misc.Unsafe操作的等价物
  • JEP 282:jlink,Java链接器,该工具可以为模块生成一个包含了其所有依赖项的自定义运行时映像,同时允许生成一个包括运行它的JVM的可执行文件
  • JavaDB被移出JDK
  • JEP 263:高DPI图像,自动缩放与尺寸自适应
  • 提供List.of()Set.of()Map.of()Map.ofEntries()等工厂方法
  • 接口支持私有方法
  • Optional类改进
  • 多版本兼容JAR包
  • try-with-resources改进
  • Stream API改进

Java SE 10

2018年3月发布,非LTS版本,OpenJDK于2018年9月停止更新,主要特性:

  • JEP 286:局部变量类型推断
  • JEP 317:实验性的基于Java的JIT编译器,Linux x64下Graal动态编译器的集成
  • JEP 310:应用程序类级别数据共享
  • JEP 322:基于时间的版本命名
  • JEP 307:适用于G1的多线程完全垃圾回收
  • JEP 304:垃圾回收器接口
  • JEP 314:更多的Unicode语言标签扩展
  • JEP 319:内置根证书
  • JEP 312:线程本地握手
  • JEP 316:在可选的内存设备上申请堆内存空间
  • JEP 313:删除本地代码头文件生成器javah
  • JEP 296:将所有JDK分支集成到同一个版本库中
  • 不可变集合改进
  • Optional新增orElseThrow()方法

Java SE 11

2018年9月发布,LTS版本,AdoptOpenJDK于2024年10月或之后停止更新,Amazon Corretto于2027年9月或之后停止更新,最后延伸支持日期:2026年9月
主要特性:

  • JEP 181:针对嵌套成员的访问控制
  • JEP 309:动态类文件常量
  • JEP 315:利用Aarch64的特有架构改进其上的性能
  • JEP 318:Epsilon,无操作垃圾收集器
  • JEP 320:移除Java EE和CORBA模块
  • JEP 321:HTTP Client重写,支持HTTP/1.1和HTTP/2,也支持websockets
  • JEP 323:Lambda参数的局部变量语法
  • JEP 324:支持Curve25519和Curve 448密钥
  • JEP 327:Unicode 10
  • JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
  • JEP 329:ChaCha20和Poly1305加密算法
  • JEP 330:运行单文件源码程序
  • JEP 331:低开销堆分析
  • JEP 332:支持TLS 1.3
  • JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
  • JEP 335:弃用Nashorn JavaScript引擎
  • JEP 336:弃用Pack200相关的工具及API
  • 增加一些字符串处理方法

Java SE 12

2019年3月发布,非LTS版本,OpenJDK于2019年9月停止更新,主要特性:

  • JEP 189:Shenandoah,一个实验性的低延迟垃圾收集器
  • JEP 230:细粒度性能评审包
  • JEP 325:Switch表达式扩展(预览阶段)
  • JEP 334:JVM Constants API
  • JEP 340:仅保留一个AArch64平台的移植
  • JEP 341:默认类数据共享归档
  • JEP 344:针对G1,提供可中止的混合垃圾收集
  • JEP 346:针对G1,及时释放已申请但未使用的内存
  • 新增NumberFormat对复杂数字的格式化
  • 字符串支持transformindent操作
  • 新增方法Files.mismatch(Path, Path)
  • Teeing Collector
  • 支持Unicode 11

Java SE 13

2019年9月发布,非LTS版本,OpenJDK于2020年3月停止更新,主要特性:

  • JEP-350:动态CDS归档
  • JEP-351:增强ZGC释放未使用内存
  • JEP-353:重新实现旧版Socket API
  • JEP-354:Switch表达式扩展,引入yield关键字(预览版本)
  • JEP-355:文本框(预览阶段)
  • 增强ZGC释放未使用内存

Java SE 14

2020年3月发布,非LTS版本,OpenJDK于2020年9月停止更新,主要特性:

  • JEP-305:使用instanceof的模式匹配(预览)
  • JEP-343:打包工具(孵化中)
  • JEP-345:在G1中,对不均匀的内存访问(NUMA)情况下的内存申请优化
  • JEP-349:JFR Event Streaming
  • JEP-352:使字节缓冲区能够映射到非易失性存储器上
  • JEP-358:有帮助的NullPointerExceptions
  • JEP-359:记录类(预览)
  • JEP-361:Switch表达式(标准)
  • JEP-362:弃用Solaris和SPARC平台上的移植版本
  • JEP-363:移除Concurrent Mark Sweep(CMS)垃圾收集器
  • JEP-364:适用于MacOS的ZGC
  • JEP-365:适用于Windows的ZGC
  • JEP-366:弃用ParallelScavenge+SerialOld的垃圾收集器组合
  • JEP-367:移除Pack200相关的工具及API
  • JEP-368:文本块(第二预览版本)
  • JEP-370:外部内存访问API(孵化中)
  • Record类型,类似于Lombok的@Data注解

Java SE 15

2020年9月发布,非LTS版本,OpenJDK于2021年3月停止更新,主要特性:

  • JEP 339:Edwards-Curve数据签名算法(EdDSA),EdDSA是一种现代的椭圆曲线签名方案
  • JEP 360:封闭类(预览)Sealed Classes,可以是封闭类或封闭接口,防止其他类或接口扩展或实现
  • JEP 371:隐藏类Hidden Classes,不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们
  • JEP 372:移除Nashorn JavaScript脚本引擎、APIs及jjs工具
  • JEP 373:重新实现DatagramSocket API接口,更改java.net.DatagramSocketjava.net.MulticastSocket为更简单的底层实现,更易于维护和调试,新的底层实现将很容易使用虚拟线程
  • JEP 374:准备禁用和废除偏向锁
  • JEP 375:使用instanceof的模式匹配(第二次预览)
  • JEP 377:ZGC,一个可伸缩、低延迟的垃圾回收器
  • JEP 378:文本块"""
  • JEP 379:Shenandoah,一个低停顿时间的垃圾回收器
  • JEP 381:移除Solaris和SPARC端口,移除了Solaris/SPARC、Solaris/x64和Linux/SPARC端口的源代码及构建支持
  • JEP 383:外存访问API(孵化),可以允许Java应用程序安全有效地访问Java堆之外的外部内存
  • JEP 384:Records(第二次预览),某些场合可以干掉Lombok,能自动生成类构造器、toString()hashCode()equals()以及类似getter的变量访问方法
  • JEP 385:废除RMI激活,RMI激活是RMI种一个过时的组件

Java SE 16

2021年3月发布,非LTS版本,OpenJDK与2021年9月停止更新,主要特性:

  • JEP 338:提供了jdk.incubator.vector来用于矢量计算
  • JEP 347:在JDK C++的源码中允许使用C++14的语言特性
  • JEP 357:OpenJDK源码的版本控制从Mercurial(hg)迁移到git
  • JEP 369:将OpenJDK源码的版本控制迁移到GitHub上
  • JEP 376:ZGC,实现了并发thread-stack处理来降低GC safepoints的负担
  • JEP 380:对socket channel及server socket channel的api提供对unix domain socket的支持
  • JEP 386:将glibc的jdk移植到使用musl的alpine linux上
  • JEP 387:支持不再使用的class metadata归还内存给操作系统,降低内存占用
  • JEP 388:移植JDK到Windows/AArch64
  • JEP 389:提供jdk.incubator.foreign来简化native code的调用
  • JEP 390:提供@jdk.internal.ValueBased来用于标注作为value-based的类
  • JEP 392:jpackage在JDK14引入,JDK15作为incubating工具,在JDK16转正,从jdk.incubator.jpackage转为jdk.jpackage,它支持Linux:deb & rpm,MacOS:pkg & dmg,Windows:msi & exe

Java SE 17

2021年9月发布,LTS版本,Azul于2029年9月停止更新,Microsoft于2027年9月停止更新,最后延伸支持日期:2029年9月
主要特性:

  • JEP 306:恢复始终执行严格模式的浮点定义,修复25年前英特尔的浮点指令存在的一些问题
  • JEP 356:引入RandomGeneratorRandomGeneratorFactory提供更好的随机数生成
  • JEP 382:使用Apple Metal API为MacOS新增了Java 2D internal rendering pipeline
  • JEP 391:迁移JDK到MacOS/AArch64
  • JEP 398:标记Applet API为废弃方便后续移除
  • JEP 403:对JDK内部的API进行更强的封装
  • JEP 406:引入switch模式匹配的preview版本,instanceof的模式匹配在JDK14作为preview,在JDK15作为第二轮的preview,在JDK16转正
  • JEP 407:移除Remote Method Invocation(RMI),它在JDK15的JEP 385被废弃
  • JEP 409:Sealed Classes在JDK15作为preview引入,在JDK16作为第二轮preview,在JDK17转正
  • JEP 410:移除实验性的Java版本的AOT及JIT Compiler
  • JEP 411:废弃Java1.0引入的Security Manager方便后续移除
  • JEP 412:引入Foreign Function & Memory API
  • JEP 414:JDK 16引入了Vector API(Incubator)提供了jdk.incubator.vector来用于矢量计算,JDK17进行改进并作为第二轮incubator
  • JEP 415:允许应用去配置指定上下文及动态选择的deserialization filters
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358