JDK 版本變化

weixin_33866037發表於2018-03-11

記錄Java版本的更新歷史,主要是對以下文章的結合:

一些術語

  • JCP 是 Java Community Process(Java社群程式)的簡稱,社會各界Java組成的社群,規劃和領導Java的發展。
  • JEP 是 JDK Enhancement Proposals (Java 增強提案)的簡稱,JDK的版本變化將從這些提案中選取。
  • JSR 是 Java Specification Requests(Java規範請求)的簡稱,是 JCP 成員向委員會提交的 Java 發展議案,經過一系列流程後,如果通過會成為 JEP,最終會體現在未來的Java中。
  • TCK 是 Technology Compatibility Kit(技術相容性測試)的簡稱, 如果一個平臺型程式想要宣稱自己相容Java,就必須通過TCK測試

JDK 11

JDK 11 目前出現了4個JEP,計劃於 2018 年 9 月釋出。

  • JEP 309: 動態類檔案常量。
  • JEP 318: 低開銷垃圾收集器 Epsilon。
  • JEP 320: 移除 Java EE 和 CORBA 模組。
  • JEP 323: Lambda 引數的本地變數語法。

JDK 10

JDK 10 按計劃將於2018年3月20日釋出。新特性有:

  • JEP 286: 區域性變數的型別推導。該特性在社群討論了很久並做了調查,可檢視 JEP 286 調查結果。
  • JEP 296: 將 JDK 的多個程式碼倉庫合併到一個儲存庫中。
  • JEP 304: 垃圾收集器介面。通過引入一個乾淨的垃圾收集器(GC)介面,改善不同垃圾收集器的原始碼隔離性。
  • JEP 307: 向 G1 引入並行 Full GC。
  • JEP 310: 應用類資料共享。為改善啟動和佔用空間,在現有的類資料共享(“CDS”)功能上再次擴充,以允許應用類放置在共享存檔中。
  • JEP 312: 執行緒區域性管控。允許停止單個執行緒,而不是隻能啟用或停止所有執行緒。
  • JEP 313: 移除 Native-Header Generation Tool (javah)
  • JEP 314: 額外的 Unicode 語言標籤擴充套件。包括:cu (貨幣型別)、fw (每週第一天為星期幾)、rg (區域覆蓋)、tz (時區) 等。
  • JEP 316: 在備用記憶體裝置上分配堆記憶體。允許 HotSpot 虛擬機器在備用記憶體裝置上分配 Java 物件堆。
  • JEP 317: 基於 Java 的 JIT 編譯器(試驗版本)。
  • JEP 319: 根證照。開源 Java SE Root CA 程式中的根證照。
  • JEP 322: 基於時間的版本釋出模式。“Feature releases” 版本將包含新特性,“Update releases” 版本僅修復 Bug 。

JDK 9

JDK 9 於2017年9月21日釋出。新特性有:

  • 模組化 —— Jigsaw
  • 互動式命令列 —— JShell
  • 預設的垃圾回收器 —— G1
  • 程式操作改進
  • 競爭鎖的效能優化
  • 分段程式碼快取
  • 優化字串佔用空間

這個版本中最引人注目的時候模組化,通過這個工作,可以構建更小的執行時環境,只需要包括Java平臺中任務依賴的部分。這可以更好地適應雲端的開發。

具體的特性包括:

  • JEP 102: 改善了控制和管理作業系統程式的 API。
  • JEP 110: 定義了一個新的 Http 客戶端 API,它實現了 HTTP/2WebSocket,並且可以替代遺留的 HttpURLConnection API。該 API 將會以一個 incubator 模組的形式進行交付。
  • JEP 143: 提高競爭 Java 物件的監視效能。
  • JEP 158: 統一 JVM 的日誌。
  • JEP 165: 通過支援執行時管理來增加對 JVM 編譯器的管理。
  • JEP 193: 對變數處理的改進。
  • JEP 197: 將程式碼快取劃分成不同的段。
  • JEP 200: 採用 Java 平臺模組化系統(Java Platform Module System,JPMS)對JDK進行模組化。
  • JEP 201: 原始碼模組化。
  • JEP 211: 在 import 語句中 省略 deprecation 的警告。
  • JEP 212: 解決 lint 和 doclint 警告。
  • JEP 213: Project Coin 的改變
  • JEP 214: 移除 JDK 8 中 GC 組合器的廢棄說明。
  • JEP 215: 在 javac 中實現了一個新的型別檢測策略。
  • JEP 216: 正確地處理匯入宣告。
  • JEP 217: 註解流水線 2.0。
  • JEP 219: 定義了資料傳輸層安全(Datagram Transport Layer Security, DTLS)API。
  • JEP 220: 模組化執行時映象。
  • JEP 221: 簡化 Doclet API。
  • JEP 222: jshell - Java 中的互動式命令列。
  • JEP 223: 新的版本字串模式。
  • JEP 224: 增強了 javadoc 工具來生成 HTML5 標記。
  • JEP 225: 增加了 javadoc 搜尋。
  • JEP 226: UTF-8 屬性檔案資源的Bundle相關變化。
  • JEP 227: Unicode 7.0。
  • JEP 228: 增加更多可診斷的命令。
  • JEP 229: 將預設的祕鑰庫從 JKS 替換為 PKCS12。
  • JEP 231: 移除執行時 JRE 版本選擇。
  • JEP 232: 增強了安全相關應用的效能。
  • JEP 233: 開發了一個工具來自動測試執行時編譯器。
  • JEP 235: 增加關於 javac 生成類檔案屬性的 測試。
  • JEP 236: 定義瞭解析 API 來支援 Nashorn 的 ECMAScript 抽象語法樹。
  • JEP 237: Linux/AArch64 埠相關。
  • JEP 238: 多版本 JAR 檔案。
  • JEP 240: 移除 JVM 的 TI hprof 客戶端。
  • JEP 241: 移除 jhat 工具。
  • JEP 243: 提供 Java 語言級的 JVM 編譯介面。
  • JEP 244: TLS 應用層協議協商。
  • JEP 245: 驗證 JVM 命令列標誌引數。
  • JEP 246: 利用 CPU 指令提升 GHASH 和 RSAd 的效能。
  • JEP 247: 對老平臺版本的編譯支援。
  • JEP 248: G1 作為預設的垃圾回收器。
  • JEP 249: 基於 TLS 實現 OCSP Stapling。
  • JEP 250: 在類資料分享(CDS)歸檔中儲存 interned 字串。
  • JEP 251: 多方案映象。
  • JEP 252: 預設使用 CLDR Locale Data。
  • JEP 253: 為 JavaFX UI 控制 和 CSS API 的模組化做準備。
  • JEP 254: 採用一個空間更加高效的 String 內部表示。
  • JEP 255: 合併 Xerces 2.11.0 中的更新。
  • JEP 256: BeanInfo 註解調整。
  • JEP 257: 更新 JavaFX/Media 中 GStreamer 的版本。
  • JEP 258: 使用 HarfBuzz 作為字型佈局引擎。
  • JEP 259: 定義了一個高效標準的 Stack-Walking API。
  • JEP 260: 封裝大部分的內部 API。
  • JEP 261: 實現模組化系統。
  • JEP 262: 支援 TIFF 影象 I/O。
  • JEP 263: 實現 Windows 和 Linux 高解析度影象介面。
  • JEP 264: 平臺日誌 API 和 服務。
  • JEP 265: Java 2D 使用 Marlin Graphics Renderer。
  • JEP 266: 併發相關的一些更新。
  • JEP 267: 支援 Unicode 8.0。
  • JEP 268: 支援 XML 目錄。
  • JEP 269: 增加一些集合類建立的工廠方法。
  • JEP 270: 為臨界區預留棧的某些區域。
  • JEP 271: 統一 GC 日誌。
  • JEP 272: 增加特定平臺的桌面特性。
  • JEP 273: Deterministic Random Bit Generator (DRBG) 的實現。
  • JEP 274: 增強方法處理器。
  • JEP 275: Java 應用模組化打包。
  • JEP 276: 語言定義物件模型的動態連結。
  • JEP 277: 改善 Deprecation。
  • JEP 278: 為 G1 中的巨大物件增加測試。
  • JEP 279: 改進測試故障排除。
  • JEP 280: 指示字串串聯。
  • JEP 281: HotSpot C++ 單元測試框架。
  • JEP 282: Java聯結器 jlink。
  • JEP 283: 在 Linux 上支援 GTK 3。
  • JEP 284: 新的 HotSpot 構建系統。
  • JEP 285: 自旋等待提示。
  • JEP 287: 實現 SHA-3 Hash 演算法。
  • JEP 288: 禁止 SHA-1 驗證。
  • JEP 289: 廢棄 Applet API。
  • JEP 290: 過濾輸入的序列化資料。
  • JEP 291: 廢棄 Concurrent Mark Sweep (CMS) 垃圾收集器。
  • JEP 292: 在 Nashorn 中支援 ECMAScript 6 特徵。
  • JEP 294: Linux/s390x 埠。
  • JEP 295: 提前編譯。
  • JEP 297: 統一 arm32/arm64 埠。
  • JEP 298: 移除過時的例子。
  • JEP 299: 重新組織文件。

JDK 8

JDK 8 於2014年3月14號釋出。從 Java 8 開始開發代號已經棄用了。新特性有:

  • Lambda 表示式
  • Pipelines 和 Streams
  • Date 和 Time API
  • Default 方法
  • Type 註解
  • Nashhorn JavaScript 引擎
  • 併發計數器
  • Parallel 操作
  • 移除 PermGen Error
  • TLS SNI

第三個有里程碑意義的 Java 版本。其中最引人注目的便是 Lambda 表示式了,從此 Java 語言原生提供了函數語言程式設計能力。Java 8 更加適應海量雲端計算的需要。

具體的特性包括:

  • JEP 117: 移除註解處理工具(Annotation-Processing Tool,apt)。
  • JEP 124: 增強證照撤銷檢查 API。
  • JEP 130: 實現 SHA-224 訊息摘要演算法。
  • JEP 131: 在 64-bit Windows 中支援 PKCS#11。
  • JEP 112: Charset 實現改善。
  • JEP 129: 實現 NSA Suite B 加密演算法。
  • JEP 105: DocTree API。
  • JEP 106: 擴充套件 javax.tools API 來支援 javadoc 的訪問。
  • JEP 113: 在 JDK 的 Kerberos 5 中新增 MS-SFU 擴充套件。
  • JEP 114: TLS Server Name Indication (SNI) 擴充套件。
  • JEP 121: 提供更強的 Password-Based-Encryption (PBE) 演算法實現。
  • JEP 122: 移除永久帶(Permanent Generation)。
  • JEP 127: 改善 Locale Data Packaging,並且採用 Unicode CLDR Data。
  • JEP 128: Unicode BCP 47 本地匹配。
  • JEP 133: 支援 Unicode 6.2。
  • JEP 136: 增強錯誤驗證。
  • JEP 153: 啟動 JavaFX 應用。
  • JEP 177: 優化 java.text.DecimalFormat.format
  • JEP 103: 並行陣列排序。
  • JEP 135: Base64 編碼和解碼。
  • JEP 138: 基於 Autoconf 的自動構建系統。
  • JEP 139: 增強 javac 來提高構建速度。
  • JEP 142: 減少對於特定域的快取記憶體的爭奪。
  • JEP 147: 減少類後設資料佔用。
  • JEP 148: 支援小虛擬機器(不超過3M)的建立。
  • JEP 149: 減少核心庫的記憶體使用。
  • JEP 150: 新的 Date 和 Time API。
  • JEP 160: lambda 函式表示式。
  • JEP 164: 利用 CPU 指令進行 AES 加密。
  • JEP 166: 針對JKS、JCEKS、PKCS12祕鑰儲存的修改。
  • JEP 170: JDBC 4.2。
  • JEP 172: DocLint。
  • JEP 173: 放棄一些很少使用的 GC 組合。
  • JEP 101: 泛華目標型別介面。
  • JEP 104: 在 Java 型別上加註解。
  • JEP 107: 增加集合的批量資料操作。
  • JEP 109: 在核心庫中增加 Lambda 表示式。
  • JEP 115: 認證加密的密碼套件。
  • JEP 118: 在執行時訪問引數名稱。
  • JEP 119: 通過反射實現 javax.lang.model.* API。
  • JEP 120: 重複註解。
  • JEP 123: 可配置的安全隨機數生成。
  • JEP 126: lambda 表示式和虛擬擴充套件方法。
  • JEP 140: 限制的 doPrivileged。
  • JEP 155: 併發庫更新。
  • JEP 161: 緊湊版本。
  • JEP 162: 為模組化做準備。
  • JEP 171: 在 sun.misc.Unsafe 中增加三個記憶體排序相關的指令。
  • JEP 174: Nashorn JavaScript 引擎。
  • JEP 176: 提供呼叫者敏感的檢測機制。
  • JEP 178: 靜態連結的 jni 庫。
  • JEP 179: JDK API 的文件的支援和穩定。
  • JEP 180: 對於頻繁衝突的 HashMap 使用平衡樹。
  • JEP 184: HTTP URL的許可權。
  • JEP 185: 限制外部 XML 資源的獲取。

JDK 7

開發代號是 Dolphin(海豚),於2011年7月28日發行。新特性有:

  • switch 語句塊中允許以字串作為分支條件;
  • 在建立泛型物件時應用型別推斷;
  • 在一個語句塊中捕獲多種異常;
  • 支援動態語言;
  • 支援 try-with-resources
  • 引入 Java NIO.2 開發包;
  • 數值型別可以用2進位制字串表示,並且可以在字串表示中新增下劃線;
  • 鑽石型語法;
  • null 值的自動處理。

這個版本中的主要的特性是 NIO2 和 Fork/Join 併發包,Java 虛擬機器的穩定性真正做到的工業級,成為一個計算平臺而服務於全世界。

JDK 6

開發代號為 Mustang(野馬),於2006年12月11日發行。新特性有:

  • 支援指令碼語言;
  • 引入 JDBC 4.0 API;
  • 引入 Java Compiler API;
  • 可插拔註解;
  • 增加對 Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos 和 LDAP(Lightweight Directory Access Protocol) 的支援;
  • 繼承 Web Services;
  • 做了很多優化。

這個語言語法改進不多,但在虛擬機器內部做了大量的改進,成為一個相當成熟穩定的版本,時至今日國內的很多公司依然以 Java6 作為主要 Java 開發版本來使用。

同年 Sun 公司做出一個偉大的決定,將 Java 開源。OpenJDK 從 Sun JDK 1.7 版本分支出去,成為今天 OpenJDK 的基礎。

JDK 5

開發代號為Tiger(老虎),於2004年9月30日發行。新特性包有:

  • 引入泛型;
  • 增強迴圈,可以使用迭代方式;
  • 自動裝箱與自動拆箱;
  • 型別安全的列舉;
  • 可變引數;
  • 靜態引入;
  • 後設資料(註解);
  • 引入 Instrumentation。

Sun 不再採用 J2SE, J2EE 這種命名方式,而使用 Java SE 5, Java EE 5 這樣的名稱。

Java 5 是第二個里程碑式的版本。Java 語言語法發生很大的變化,如註解 (Annotation),裝箱 (Autoboxing),泛型 (Generic),列舉 (Enum),foreach 等被加入,提供了 java.util.concurrent 併發包。

Java 5 對於 Java 語言的推動是巨大的,特別是註解的加入,使得語言定義靈活了很多,程式設計師可以寫出更加符合領域定義的描述性程式。

JDK 1.4

開發代號為 Merlin(隼),於2004年2月06日發行(首次在JCP下發行)。新特性有:

  • XML 處理;
  • Java 列印服務;
  • 引入 Logging API;
  • 引入 Java Web Start;
  • 引入 JDBC 3.0 API;
  • 引入斷言;
  • 引入 Preferences API;
  • 引入鏈式異常處理;
  • 支援 IPv6;
  • 支援正規表示式;
  • 引入 Image I/O slot machine API。

Java 語言真正走向成熟,提供了非常完備的語言特性,如 NIO,正規表示式,XML 處理器等。

同年微軟的.NET 框架釋出,兩者開始了為期十幾年的暗自競爭。從語言特性上來說,.NET 後發先至,一直處於優勢。但 Java 依賴良好的開發者生態,絕大多數大型軟體公司的使用者眾多和不斷貢獻,以及對 Linux 作業系統良好的支援,漸漸的在伺服器端獲得優勢地位。

JDK 1.3

開發代號為 Kestrel(紅隼),於2000年5月08日發行。新特性有:

  • 引入Java Sound API;
  • jar 檔案索引;
  • 對 Java 的各個方面都做了大量優化和增強。

J2EE 中的 Servlet 規範獲得了極大的成功,伴隨著網際網路的興起,和瀏覽器直接通過 HTTP 協議互動的 Servlet,和眾多的 MVC 框架,成為 Web1.0 的網紅。

JDK 1.2

開發代號為 Playground(操場),於1998年12月8日發行。新特性有:

  • 引入集合(Collection)框架;
  • 對字串常量做記憶體對映;
  • 引入 JIT(Just In Time) 編譯器;
  • 引入對打包的 Java 檔案進行數字簽名;
  • 引入控制授權訪問系統資源的策略工具;
  • 引入 JFC(Java Foundation Classes),包括 Swing 1.0、拖放和 Java 2D 類庫;
  • 引入 Java 外掛;
  • 在 JDBC 中引入可滾動結果集、BLOB、CLOB、批量更新和使用者自定義型別;
  • 在 Applet 中新增聲音支援。

Java 第一個里程碑式的版本。JIT(Just in time)編譯器技術,使得語言的可遷移性和執行效率達到最優的平衡,同時 Collections 集合類設計優良,在企業應用開發中迅速得到了廣泛使用。

Sun 公司把 Java 技術體系分成三個方向,分別是 J2SE(面向桌面和通用應用開發),J2EE(面向企業級應用開發),J2ME(面向移動終端開發)。這個分類影響非常久遠,體現出主流語言設計者的思想:針對於不同的應用領域,在形態,API 集合等進行劃分。

JDK 1.1

於 1997年2月19日發行,新特性有:

  • 引入JDBC(Java Database Connectivity);
  • 支援內部類;
  • 引入Java Bean;
  • 引入RMI(Remote Method Invocation);
  • 引入反射(僅用於內省)。

Java 語言的基本形態基本確定了,比如反射 (reflection), JavaBean, 介面和類的關係等等,一直到今天都保持一致。然而,Java 最初的一些目標,如在瀏覽器中執行 Applet,以及跨平臺的圖形介面 Awt 很快遭遇到負面的評價。

JDK 1.0

開發代號為Oak(橡樹),於1996年1月23發行。特點有:

  • 提供了一個解釋執行的 Java 虛擬機器;
  • Applet 能在 Mozilla 瀏覽器中執行。

Java 的 Applet 能在 Mozilla 瀏覽器中執行,被看作是未來的網際網路語言。

起源

Java 語言源於 1991 年 Sun 公司 James Gosling 領導的的 Ork 專案,1995 年 Sun 公司正式起名為 Java,並提出“Write once, Run anywhere"的口號。

文件記錄在Github: JDKHistory

相關文章