1. 發(fā)布特點(diǎn)
發(fā)行版本 | 發(fā)行時(shí)間 | 備注 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司發(fā)布了Java的第一個(gè)開(kāi)發(fā)工具包 |
Java 5.0 | 2004.09.30 | ①版本號(hào)從1.4直接更新至5.0;②平臺(tái)更名為JavaSE、JavaEE、JavaME |
Java 8.0 | 2014.03.18 | 此版本是繼Java 5.0以來(lái)變化最大的版本。是長(zhǎng)期支持版本(LTS ) |
Java 9.0 | 2017.09.22 | 此版本開(kāi)始,每半年更新一次 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK安裝包取消獨(dú)立JRE安裝包,是長(zhǎng)期支持版本(LTS ) |
Java 12.0 | 2019.03.19 | |
… | … | |
Java17.0 | 2021.09 | 發(fā)布Java 17.0,版本號(hào)也稱(chēng)為21.9,是長(zhǎng)期支持版本(LTS ) |
… | … | |
Java19.0 | 2022.09 | 發(fā)布Java19.0,版本號(hào)也稱(chēng)為22.9。 |
從Java 9 這個(gè)版本開(kāi)始,Java 的計(jì)劃發(fā)布周期是 6個(gè)月
。
這意味著Java的更新從傳統(tǒng)的以特性驅(qū)動(dòng)
的發(fā)布周期,轉(zhuǎn)變?yōu)橐?code>時(shí)間驅(qū)動(dòng)的發(fā)布模式,并且承諾不會(huì)跳票。通過(guò)這樣的方式,開(kāi)發(fā)團(tuán)隊(duì)可以把一些關(guān)鍵特性盡早合并到 JDK 之中,以快速得到開(kāi)發(fā)者反饋,在一定程度上避免出現(xiàn)像 Java 9 兩次被迫延遲發(fā)布的窘?jīng)r。
針對(duì)企業(yè)客戶(hù)的需求,Oracle 將以三年
為周期發(fā)布長(zhǎng)期支持版本(long term support)。
Oracle 的官方觀(guān)點(diǎn)認(rèn)為:與 Java 7->8->9 相比,Java 9->10->11的升級(jí)和 8->8u20->8u40 更相似。
新模式下的 Java 版本發(fā)布都會(huì)包含許多變更,包括語(yǔ)言變更
和 JVM 變更
,這兩者都會(huì)對(duì) IDE、字節(jié)碼庫(kù)和框架產(chǎn)生重大影響。此外,不僅會(huì)新增其他 API,還會(huì)有 API被刪除
(這在 Java 8 之前沒(méi)有發(fā)生過(guò))。
目前看這種發(fā)布策略是非常成功的,解開(kāi)了 Java/JVM 演進(jìn)的許多枷鎖,至關(guān)重要的是,OpenJDK 的權(quán)力中心,正在轉(zhuǎn)移到開(kāi)發(fā)社區(qū)和開(kāi)發(fā)者手中。 在新的模式中,既可以利用 LTS 滿(mǎn)足企業(yè)長(zhǎng)期可靠支持的需求,也可以滿(mǎn)足各種開(kāi)發(fā)者對(duì)于新特性迭代的訴求。因?yàn)橛?2-3 年的最小間隔粒度來(lái)試驗(yàn)一個(gè)特性,基本是不現(xiàn)實(shí)的。
2. 名詞解釋
Oracle JDK和Open JDK
這兩個(gè)JDK最大不同就是許可證不一樣。但是對(duì)于個(gè)人用戶(hù)來(lái)講,沒(méi)區(qū)別。
Oracle JDK | Open JDK | |
---|---|---|
來(lái)源 | Oracle團(tuán)隊(duì)維護(hù) | Oracle和Open Java社區(qū) |
授權(quán)協(xié)議 | Java 17及更高版本 Oracle Java SE 許可證 Java16及更低版本甲骨文免費(fèi)條款和條件 (NFTC) 許可協(xié)議 |
GPL v2許可證 |
關(guān)系 | 由Open JDK構(gòu)建,增加了少許內(nèi)容 | |
是否收費(fèi) | 2021年9月起Java17及更高版本所有用戶(hù)免費(fèi)。 16及更低版本,個(gè)人用戶(hù)、開(kāi)發(fā)用戶(hù)免費(fèi)。 | 2017年9月起,所有版本免費(fèi) |
對(duì)語(yǔ)法的支持 | 一致 | 一致 |
JEP
JEP(JDK Enhancement Proposals)
:jdk 改進(jìn)提案,每當(dāng)需要有新的設(shè)想時(shí)候,JEP可以提出非正式的規(guī)范(specification),被正式認(rèn)可的JEP正式寫(xiě)進(jìn)JDK的發(fā)展路線(xiàn)圖并分配版本號(hào)。
LTS
LTS(Long-term Support)
即 長(zhǎng)期支持 。Oracle官網(wǎng)提供了對(duì)Oracle JDK個(gè)別版本的長(zhǎng)期支持,即使發(fā)發(fā)行了新版本,比如目前最新的JDK19,在結(jié)束日期前,LTS版本都會(huì)被長(zhǎng)期支持。(出了bug,會(huì)被修復(fù),非LTS則不會(huì)再有補(bǔ)丁發(fā)布)所以,一定要選一個(gè)LTS版本,不然出了漏洞沒(méi)人修復(fù)了。
版本 | 開(kāi)始日期 | 結(jié)束日期 | 延期結(jié)束日期 |
---|---|---|---|
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三個(gè)。
3. 各版本支持時(shí)間路線(xiàn)圖
4. 各版本介紹
jdk 9
Java 9 提供了超過(guò)150項(xiàng)
新功能特性,包括備受期待的模塊化系統(tǒng)、可交互的 REPL 工具:jshell,JDK 編譯工具,Java 公共 API 和私有代碼,以及安全增強(qiáng)、擴(kuò)展提升、性能管理改善等。
特性太多,查看鏈接:
https://openjdk.java.net/projects/jdk9/
jdk 10
https://openjdk.java.net/projects/jdk/10/
286: Local-Variable Type Inference 局部變量類(lèi)型推斷
296: Consolidate the JDK Forest into a Single Repository JDK庫(kù)的合并
304: Garbage-Collector Interface 統(tǒng)一的垃圾回收接口
307: Parallel Full GC for G1 為G1提供并行的Full GC
310: Application Class-Data Sharing 應(yīng)用程序類(lèi)數(shù)據(jù)(AppCDS)共享
312: Thread-Local Handshakes ThreadLocal握手交互
313: Remove the Native-Header Generation Tool (javah) 移除JDK中附帶的javah工具
314: Additional Unicode Language-Tag Extensions 使用附加的Unicode語(yǔ)言標(biāo)記擴(kuò)展
316: Heap Allocation on Alternative Memory Devices 能將堆內(nèi)存占用分配給用戶(hù)指定的備用內(nèi)存設(shè)備
317: Experimental Java-Based JIT Compiler 使用Graal基于Java的編譯器
319: Root Certificates 根證書(shū)
322: Time-Based Release Versioning 基于時(shí)間定于的發(fā)布版本
jdk 11
https://openjdk.java.net/projects/jdk/11/
181: Nest-Based Access Control 基于嵌套的訪(fǎng)問(wèn)控制
309: Dynamic Class-File Constants 動(dòng)態(tài)類(lèi)文件常量
315: Improve Aarch64 Intrinsics 改進(jìn) Aarch64 Intrinsics
318: Epsilon: A No-Op Garbage Collector Epsilon — 一個(gè)No-Op(無(wú)操作)的垃圾收集器
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 參數(shù)的局部變量語(yǔ)法
324: Key Agreement with Curve25519 and Curve448 Curve25519 和 Curve448 算法的密鑰協(xié)議
327: Unicode 10
328: Flight Recorder 飛行記錄儀
329: ChaCha20 and Poly1305 Cryptographic Algorithms ChaCha20 和 Poly1305 加密算法
330: Launch Single-File Source-Code Programs 啟動(dòng)單一文件的源代碼程序
331: Low-Overhead Heap Profiling 低開(kāi)銷(xiāo)的 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
jdk 12
https://openjdk.java.net/projects/jdk/12/
189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 低暫停時(shí)間的GC
230: Microbenchmark Suite 微基準(zhǔn)測(cè)試套件
325: Switch Expressions (Preview) switch表達(dá)式
334: JVM Constants API JVM常量API
340: One AArch64 Port, Not Two 只保留一個(gè)AArch64實(shí)現(xiàn)
341: Default CDS Archives 默認(rèn)類(lèi)數(shù)據(jù)共享歸檔文件
344: Abortable Mixed Collections for G1 可中止的G1 Mixed GC
346: Promptly Return Unused Committed Memory from G1 G1及時(shí)返回未使用的已分配內(nèi)存
jdk 13
https://openjdk.java.net/projects/jdk/13/
350: Dynamic CDS Archives 動(dòng)態(tài)CDS檔案
351: ZGC: Uncommit Unused Memory ZGC:取消使用未使用的內(nèi)存
353: Reimplement the Legacy Socket API 重新實(shí)現(xiàn)舊版套接字API
354: Switch Expressions (Preview) switch表達(dá)式(預(yù)覽)
355: Text Blocks (Preview) 文本塊(預(yù)覽)
jdk 14
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內(nèi)存分配
349: JFR Event Streaming JFR事件流
352: Non-Volatile Mapped Byte Buffers 非易失性映射字節(jié)緩沖區(qū)
358: Helpful NullPointerExceptions 實(shí)用的NullPointerExceptions
359: Records (Preview)
361: Switch Expressions (Standard) Switch表達(dá)式
362: Deprecate the Solaris and SPARC Ports 棄用Solaris和SPARC端口
363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector 刪除并發(fā)標(biāo)記掃描(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) 外部存儲(chǔ)器訪(fǎng)問(wèn)API
jdk 15
https://openjdk.java.net/projects/jdk/15/
339: Edwards-Curve Digital Signature Algorithm (EdDSA) EdDSA 數(shù)字簽名算法
360: Sealed Classes (Preview) 密封類(lèi)(預(yù)覽)
371: Hidden Classes 隱藏類(lèi)
372: Remove the Nashorn JavaScript Engine 移除 Nashorn JavaScript 引擎
373: Reimplement the Legacy DatagramSocket API 重新實(shí)現(xiàn) Legacy DatagramSocket API
374: Disable and Deprecate Biased Locking 禁用偏向鎖定
375: Pattern Matching for instanceof (Second Preview) instanceof 模式匹配(第二次預(yù)覽)
377: ZGC: A Scalable Low-Latency Garbage Collector ZGC:一個(gè)可擴(kuò)展的低延遲垃圾收集器
378: Text Blocks 文本塊
379: Shenandoah: A Low-Pause-Time Garbage Collector Shenandoah:低暫停時(shí)間垃圾收集器
381: Remove the Solaris and SPARC Ports 移除 Solaris 和 SPARC 端口
383: Foreign-Memory Access API (Second Incubator) 外部存儲(chǔ)器訪(fǎng)問(wèn) API(第二次孵化版)
384: Records (Second Preview) Records(第二次預(yù)覽)
385: Deprecate RMI Activation for Removal 廢棄 RMI 激活機(jī)制
jdk 16
https://openjdk.java.net/projects/jdk/16/
338: Vector API (Incubator) Vector API(孵化器)
347: Enable C++14 Language Features JDK C++的源碼中允許使用C++14的語(yǔ)言特性
357: Migrate from Mercurial to Git OpenJDK源碼的版本控制從Mercurial (hg) 遷移到git
369: Migrate to GitHub OpenJDK源碼的版本控制遷移到github上
376: ZGC: Concurrent Thread-Stack Processing ZGC:并發(fā)線(xiàn)程處理
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來(lái)簡(jiǎn)化native code的調(diào)用
390: Warnings for Value-Based Classes 提供基于值的類(lèi)的警告
392: Packaging Tool jpackage打包工具轉(zhuǎn)正
393: Foreign-Memory Access API (Third Incubator)
394: Pattern Matching for instanceof Instanceof的模式匹配轉(zhuǎn)正
395: Records Records轉(zhuǎn)正
396: Strongly Encapsulate JDK Internals by Default 默認(rèn)情況下,封裝了JDK內(nèi)部構(gòu)件
397: Sealed Classes (Second Preview) 密封類(lèi)
jdk 17
https://openjdk.java.net/projects/jdk/17/
306: Restore Always-Strict Floating-Point Semantics 恢復(fù)始終嚴(yán)格的浮點(diǎn)語(yǔ)義
356: Enhanced Pseudo-Random Number Generators 增強(qiáng)型偽隨機(jī)數(shù)生成器
382: New macOS Rendering Pipeline 新的macOS渲染管道
391: macOS/AArch64 Port macOS/AArch64端口
398: Deprecate the Applet API for Removal 棄用Applet API后續(xù)將進(jìn)行刪除
403: Strongly Encapsulate JDK Internals 強(qiáng)封裝JDK的內(nèi)部API
406: Pattern Matching for switch (Preview) switch模式匹配(預(yù)覽)
407: Remove RMI Activation 刪除RMI激活機(jī)制
409: Sealed Classes 密封類(lèi)轉(zhuǎn)正
410: Remove the Experimental AOT and JIT Compiler 刪除實(shí)驗(yàn)性的AOT和JIT編譯器
411: Deprecate the Security Manager for Removal 棄用即將刪除的安全管理器
412: Foreign Function & Memory API (Incubator) 外部函數(shù)和內(nèi)存API(孵化特性)
414: Vector API (Second Incubator) Vector API(第二次孵化特性)
415: Context-Specific Deserialization Filters 上下文特定的反序列化過(guò)濾器
jdk 18
https://openjdk.org/projects/jdk/18/
400: UTF-8 by Default 默認(rèn)為UTF-8
408: Simple Web Server 簡(jiǎn)單的Web服務(wù)器
413: Code Snippets in Java API Documentation Java API文檔中的代碼片段
416: Reimplement Core Reflection with Method Handles 用方法句柄重新實(shí)現(xiàn)核心反射
417: Vector API (Third Incubator) Vector API(第三個(gè)孵化器)
418: Internet-Address Resolution SPI internet地址解析SPI
419: Foreign Function & Memory API (Second Incubator) 外部函數(shù)與內(nèi)存API(第二孵化器)
420: Pattern Matching for switch (Second Preview) 開(kāi)關(guān)模式匹配(第二次預(yù)覽)
421: Deprecate Finalization for Removal 不贊成刪除最終化
jdk 19
https://openjdk.org/projects/jdk/19/
405: Record Patterns (Preview) 記錄模式(預(yù)覽)
422: Linux/RISC-V Port Linux / RISC-V端口
424: Foreign Function & Memory API (Preview) 外部函數(shù)和內(nèi)存API(預(yù)覽)
425: Virtual Threads (Preview) 虛擬線(xiàn)程(預(yù)覽版)
426: Vector API (Fourth Incubator) Vector API(第四個(gè)孵化器)
427: Pattern Matching for switch (Third Preview) 開(kāi)關(guān)模式匹配(第三次預(yù)覽)
428: Structured Concurrency (Incubator) 結(jié)構(gòu)化并發(fā)(孵化器)
jdk 20
https://openjdk.org/projects/jdk/20/
429: Scoped Values (Incubator) 范圍值(孵化器)
432: Record Patterns (Second Preview) 記錄模式(第二次預(yù)覽)
433: Pattern Matching for switch (Fourth Preview) 開(kāi)關(guān)模式匹配(第四次預(yù)覽)
434: Foreign Function & Memory API (Second Preview) 外部函數(shù)和內(nèi)存API(第二次預(yù)覽)
436: Virtual Threads (Second Preview) 虛擬線(xiàn)程(第二次預(yù)覽版)
437: Structured Concurrency (Second Incubator) 結(jié)構(gòu)化并發(fā)(第二個(gè)孵化器)
438: Vector API (Fifth Incubator) 載體API(第五孵化器)
5. JDK各版本下載鏈接
https://www.oracle.com/java/technologies/downloads/archive/
6. 應(yīng)該如何學(xué)習(xí)新特性
對(duì)于新特性,應(yīng)該從哪幾個(gè)角度學(xué)習(xí)新特性呢?
-
語(yǔ)法層面:
- 比如JDK5中的自動(dòng)拆箱、自動(dòng)裝箱、
enum
、泛型 - 比如JDK8中的
lambda
表達(dá)式、接口中的默認(rèn)方法、靜態(tài)方法 - 比如JDK10中局部變量的類(lèi)型推斷
- 比如JDK12中的
switch
- 比如JDK13中的文本塊
- 比如JDK5中的自動(dòng)拆箱、自動(dòng)裝箱、
-
API層面:
- 比如JDK8中的
Stream
、Optional
、新的日期時(shí)間、HashMap
的底層結(jié)構(gòu) - 比如JDK9中
String
的底層結(jié)構(gòu) - 新的 / 過(guò)時(shí)的 API
- 比如JDK8中的
-
底層優(yōu)化
-
比如JDK8中永久代被元空間替代、新的JS執(zhí)行引擎文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-438024.html
-
比如新的垃圾回收器、GC參數(shù)、JVM的優(yōu)化文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438024.html
-
到了這里,關(guān)于JDK的版本迭代(JDK9 - JDK20)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!