发行版本 | 发行时间 | 备注 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司发布了Java的第一个开发工具包 |
Java 5.0 | 2004.09.30 | ①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaEE、JavaME |
Java 8.0 | 2014.03.18 | 此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS) |
Java 9.0 | 2017.09.22 | 此版本开始,每半年更新一次 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK安装包取消独立JRE安装包,是长期支持版本(LTS) |
Java 12.0 | 2019.03.19 | |
… | … | |
Java17.0 | 2021.09 | 发布Java 17.0,版本号也称为21.9,是长期支持版本(LTS) |
… | … | |
Java19.0 | 2022.09 | 发布Java19.0,版本号也称为22.9。 |
从Java 9 这个版本开始,Java 的计划发布周期是 6个月
。
这意味着Java的更新从传统的以特性驱动
的发布周期,转变为以时间驱动
的发布模式,并且承诺不会跳票。通过这样的方式,开发团队可以把一些关键特性尽早合并到 JDK 之中,以快速得到开发者反馈,在一定程度上避免出现像 Java 9 两次被迫延迟发布的窘况。
针对企业客户的需求,Oracle 将以三年
为周期发布长期支持版本(long term support)。
Oracle 的官方观点认为:与 Java 7->8->9 相比,Java 9->10->11的升级和 8->8u20->8u40 更相似。
新模式下的 Java 版本发布都会包含许多变更,包括语言变更
和 JVM 变更
,这两者都会对 IDE、字节码库和框架产生重大影响。此外,不仅会新增其他 API,还会有 API被删除
(这在 Java 8 之前没有发生过)。
目前看这种发布策略是非常成功的,解开了 Java/JVM 演进的许多枷锁,至关重要的是,OpenJDK 的权力中心,正在转移到开发社区和开发者手中。 在新的模式中,既可以利用 LTS 满足企业长期可靠支持的需求,也可以满足各种开发者对于新特性迭代的诉求。因为用 2-3 年的最小间隔粒度来试验一个特性,基本是不现实的。
这两个JDK最大不同就是许可证不一样。但是对于个人用户来讲,没区别。
Oracle JDK | Open JDK | |
---|---|---|
来源 | Oracle团队维护 | Oracle和Open Java社区 |
授权协议 | Java 17及更高版本 Oracle Java SE 许可证Java16及更低版本甲骨文免费条款和条件 (NFTC) 许可协议 | GPL v2许可证 |
关系 | 由Open JDK构建,增加了少许内容 | |
是否收费 | 2021年9月起Java17及更高版本所有用户免费。 16及更低版本,个人用户、开发用户免费。 | 2017年9月起,所有版本免费 |
对语法的支持 | 一致 | 一致 |
JEP(JDK Enhancement Proposals)
:jdk 改进提案,每当需要有新的设想时候,JEP可以提出非正式的规范(specification),被正式认可的JEP正式写进JDK的发展路线图并分配版本号。
LTS(Long-term Support)
即 长期支持 。Oracle官网提供了对Oracle JDK个别版本的长期支持,即使发发行了新版本,比如目前最新的JDK19,在结束日期前,LTS版本都会被长期支持。(出了bug,会被修复,非LTS则不会再有补丁发布)所以,一定要选一个LTS版本,不然出了漏洞没人修复了。
版本 | 开始日期 | 结束日期 | 延期结束日期 |
---|---|---|---|
7(LTS) | 2011年7月 | 2019年7月 | 2022年7月 |
8(LTS) | 2014年3月 | 2022年3月 | 2030年12月 |
11(LTS) | 2018年9月 | 2023年9月 | 2026年9月 |
17(LTS) | 2021年9月 | 2026年9月 | 2029年9月 |
21(LTS) | 2023年9月 | 2028年9月 | 2031年9月 |
如果要选择Oracle JDK,目前可选的LTS版本为8、11、17三个。
Java 9 提供了超过150项
新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。
特性太多,查看链接:
https://openjdk.java.net/projects/jdk9/
https://openjdk.java.net/projects/jdk/10/
286: Local-Variable Type Inference 局部变量类型推断 296: Consolidate the JDK Forest into a Single Repository JDK库的合并 304: Garbage-Collector Interface 统一的垃圾回收接口 307: Parallel Full GC for G1 为G1提供并行的Full GC 310: Application Class-Data Sharing 应用程序类数据(AppCDS)共享 312: Thread-Local Handshakes ThreadLocal握手交互 313: Remove the Native-Header Generation Tool (javah) 移除JDK中附带的javah工具 314: Additional Unicode Language-Tag Extensions 使用附加的Unicode语言标记扩展 316: Heap Allocation on Alternative Memory Devices 能将堆内存占用分配给用户指定的备用内存设备 317: Experimental Java-Based JIT Compiler 使用Graal基于Java的编译器 319: Root Certificates 根证书 322: Time-Based Release Versioning 基于时间定于的发布版本
https://openjdk.java.net/projects/jdk/11/
181: Nest-Based Access Control 基于嵌套的访问控制 309: Dynamic Class-File Constants 动态类文件常量 315: Improve Aarch64 Intrinsics 改进 Aarch64 Intrinsics 318: Epsilon: A No-Op Garbage Collector Epsilon — 一个No-Op(无操作)的垃圾收集器 320: Remove the Java EE and CORBA Modules 删除 Java EE 和 CORBA 模块 321: HTTP Client (Standard) HTTPClient API 323: Local-Variable Syntax for Lambda Parameters 用于 Lambda 参数的局部变量语法 324: Key Agreement with Curve25519 and Curve448 Curve25519 和 Curve448 算法的密钥协议 327: Unicode 10 328: Flight Recorder 飞行记录仪 329: ChaCha20 and Poly1305 Cryptographic Algorithms ChaCha20 和 Poly1305 加密算法 330: Launch Single-File Source-Code Programs 启动单一文件的源代码程序 331: Low-Overhead Heap Profiling 低开销的 Heap Profiling 332: Transport Layer Security (TLS) 1.3 支持 TLS 1.3 333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental) 可伸缩低延迟垃圾收集器 335: Deprecate the Nashorn JavaScript Engine 弃用 Nashorn JavaScript 引擎 336: Deprecate the Pack200 Tools and API 弃用 Pack200 工具和 API
https://openjdk.java.net/projects/jdk/12/
189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 低暂停时间的GC 230: Microbenchmark Suite 微基准测试套件 325: Switch Expressions (Preview) switch表达式 334: JVM Constants API JVM常量API 340: One AArch64 Port, Not Two 只保留一个AArch64实现 341: Default CDS Archives 默认类数据共享归档文件 344: Abortable Mixed Collections for G1 可中止的G1 Mixed GC 346: Promptly Return Unused Committed Memory from G1 G1及时返回未使用的已分配内存
https://openjdk.java.net/projects/jdk/13/
350: Dynamic CDS Archives 动态CDS档案 351: ZGC: Uncommit Unused Memory ZGC:取消使用未使用的内存 353: Reimplement the Legacy Socket API 重新实现旧版套接字API 354: Switch Expressions (Preview) switch表达式(预览) 355: Text Blocks (Preview) 文本块(预览)
https://openjdk.java.net/projects/jdk/14/
305: Pattern Matching for instanceof (Preview) instanceof的模式匹配 343: Packaging Tool (Incubator) 打包工具 345: NUMA-Aware Memory Allocation for G1 G1的NUMA-Aware内存分配 349: JFR Event Streaming JFR事件流 352: Non-Volatile Mapped Byte Buffers 非易失性映射字节缓冲区 358: Helpful NullPointerExceptions 实用的NullPointerExceptions 359: Records (Preview) 361: Switch Expressions (Standard) Switch表达式 362: Deprecate the Solaris and SPARC Ports 弃用Solaris和SPARC端口 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector 删除并发标记扫描(CMS)垃圾回收器 364: ZGC on macOS 365: ZGC on Windows 366: Deprecate the ParallelScavenge + SerialOld GC Combination 弃用ParallelScavenge + SerialOld GC组合 367: Remove the Pack200 Tools and API 删除Pack200工具和API 368: Text Blocks (Second Preview) 文本块 370: Foreign-Memory Access API (Incubator) 外部存储器访问API
https://openjdk.java.net/projects/jdk/15/
339: Edwards-Curve Digital Signature Algorithm (EdDSA) EdDSA 数字签名算法 360: Sealed Classes (Preview) 密封类(预览) 371: Hidden Classes 隐藏类 372: Remove the Nashorn JavaScript Engine 移除 Nashorn JavaScript 引擎 373: Reimplement the Legacy DatagramSocket API 重新实现 Legacy DatagramSocket API 374: Disable and Deprecate Biased Locking 禁用偏向锁定 375: Pattern Matching for instanceof (Second Preview) instanceof 模式匹配(第二次预览) 377: ZGC: A Scalable Low-Latency Garbage Collector ZGC:一个可扩展的低延迟垃圾收集器 378: Text Blocks 文本块 379: Shenandoah: A Low-Pause-Time Garbage Collector Shenandoah:低暂停时间垃圾收集器 381: Remove the Solaris and SPARC Ports 移除 Solaris 和 SPARC 端口 383: Foreign-Memory Access API (Second Incubator) 外部存储器访问 API(第二次孵化版) 384: Records (Second Preview) Records(第二次预览) 385: Deprecate RMI Activation for Removal 废弃 RMI 激活机制
https://openjdk.java.net/projects/jdk/16/
338: Vector API (Incubator) Vector API(孵化器) 347: Enable C++14 Language Features JDK C++的源码中允许使用C++14的语言特性 357: Migrate from Mercurial to Git OpenJDK源码的版本控制从Mercurial (hg) 迁移到git 369: Migrate to GitHub OpenJDK源码的版本控制迁移到github上 376: ZGC: Concurrent Thread-Stack Processing ZGC:并发线程处理 380: Unix-Domain Socket Channels Unix域套接字通道 386: Alpine Linux Port 将glibc的jdk移植到使用musl的alpine linux上 387: Elastic Metaspace 弹性元空间 388: Windows/AArch64 Port 移植JDK到Windows/AArch64 389: Foreign Linker API (Incubator) 提供jdk.incubator.foreign来简化native code的调用 390: Warnings for Value-Based Classes 提供基于值的类的警告 392: Packaging Tool jpackage打包工具转正 393: Foreign-Memory Access API (Third Incubator) 394: Pattern Matching for instanceof Instanceof的模式匹配转正 395: Records Records转正 396: Strongly Encapsulate JDK Internals by Default 默认情况下,封装了JDK内部构件 397: Sealed Classes (Second Preview) 密封类
https://openjdk.java.net/projects/jdk/17/
306: Restore Always-Strict Floating-Point Semantics 恢复始终严格的浮点语义 356: Enhanced Pseudo-Random Number Generators 增强型伪随机数生成器 382: New macOS Rendering Pipeline 新的macOS渲染管道 391: macOS/AArch64 Port macOS/AArch64端口 398: Deprecate the Applet API for Removal 弃用Applet API后续将进行删除 403: Strongly Encapsulate JDK Internals 强封装JDK的内部API 406: Pattern Matching for switch (Preview) switch模式匹配(预览) 407: Remove RMI Activation 删除RMI激活机制 409: Sealed Classes 密封类转正 410: Remove the Experimental AOT and JIT Compiler 删除实验性的AOT和JIT编译器 411: Deprecate the Security Manager for Removal 弃用即将删除的安全管理器 412: Foreign Function & Memory API (Incubator) 外部函数和内存API(孵化特性) 414: Vector API (Second Incubator) Vector API(第二次孵化特性) 415: Context-Specific Deserialization Filters 上下文特定的反序列化过滤器
https://openjdk.org/projects/jdk/18/
400: UTF-8 by Default 默认为UTF-8 408: Simple Web Server 简单的Web服务器 413: Code Snippets in Java API Documentation Java API文档中的代码片段 416: Reimplement Core Reflection with Method Handles 用方法句柄重新实现核心反射 417: Vector API (Third Incubator) Vector API(第三个孵化器) 418: Internet-Address Resolution SPI internet地址解析SPI 419: Foreign Function & Memory API (Second Incubator) 外部函数与内存API(第二孵化器) 420: Pattern Matching for switch (Second Preview) 开关模式匹配(第二次预览) 421: Deprecate Finalization for Removal 不赞成删除最终化
https://openjdk.org/projects/jdk/19/
405: Record Patterns (Preview) 记录模式(预览) 422: Linux/RISC-V Port Linux / RISC-V端口 424: Foreign Function & Memory API (Preview) 外部函数和内存API(预览) 425: Virtual Threads (Preview) 虚拟线程(预览版) 426: Vector API (Fourth Incubator) Vector API(第四个孵化器) 427: Pattern Matching for switch (Third Preview) 开关模式匹配(第三次预览) 428: Structured Concurrency (Incubator) 结构化并发(孵化器)
https://openjdk.org/projects/jdk/20/
429: Scoped Values (Incubator) 范围值(孵化器) 432: Record Patterns (Second Preview) 记录模式(第二次预览) 433: Pattern Matching for switch (Fourth Preview) 开关模式匹配(第四次预览) 434: Foreign Function & Memory API (Second Preview) 外部函数和内存API(第二次预览) 436: Virtual Threads (Second Preview) 虚拟线程(第二次预览版) 437: Structured Concurrency (Second Incubator) 结构化并发(第二个孵化器) 438: Vector API (Fifth Incubator) 载体API(第五孵化器)
https://www.oracle.com/java/technologies/downloads/archive/
对于新特性,应该从哪几个角度学习新特性呢?
enum
、泛型lambda
表达式、接口中的默认方法、静态方法switch
Stream
、Optional
、新的日期时间、HashMap
的底层结构String
的底层结构