最近小組在開展讀書角活動,我們小組選的是《深入理解JVM虛擬機》,相信這本書對於各位程式猿們都不陌生,我也是之前在學校準備面試期間大致讀過一遍,emm時隔多日,對裡面的知識也就模糊了。這次開始的時候從前面的JDK發展史和JVM虛擬機家族著手,之前都是粗略讀過,這次通過查閱相關資料並收集在每一個JDK... ...
1.前言
最近小組在開展讀書角活動,我們小組選的是《深入理解JVM虛擬機》,相信這本書對於各位程式猿們都不陌生,我也是之前在學校準備面試期間大致讀過一遍,emm時隔多日,對裡面的知識也就模糊了。這次開始的時候從前面的JDK發展史和JVM虛擬機家族著手,之前都是粗略讀過,這次通過查閱相關資料並收集在每一個JDK版本演化期間所發生的的一些趣聞,發現還是比較有意思的,以下是關於有關JDK發展史的總結分享。
2.JDK各版本特性及趣聞
- JDK版本演變及各版本特性
◦JDK 1.0 (1996):
▪包含Java語言、Java類庫和Java虛擬機。支持圖形用戶界面(GUI)、資料庫連接(JDBC)等功能。
"Oak" 是 Java 語言的前身,由於“Oak”這個名稱已經被其他公司使用了,因此在1995年,Java 的創造者——Sun 公司決定將其改名為“Java”。 據說,這個名稱是來自於一家咖啡店。當時,在設計 Java 語言的時候,創始團隊成員到一家咖啡店買咖啡時,發現這家咖啡店的名字叫做“Java Coffee”,於是決定以“Java”作為新的名稱。
◦JDK 1.1 (1997-2):
▪增加了內部類、JavaBeans、遠程方法調用(RMI)等功能。
◦JDK 1.2 / Java 2 (1998-12):
▪引入了Swing組件、反射機制和動態代理、集合框架、Java 2D和Java 3D圖形等特性。
這是Java SE第一個真正具有商業價值的版本。該版本引入了Java命名空間(namespace)等特性,使得Java應用程式能夠更好地組織和管理。在此階段並存過三個虛擬機,Classic VM、HotSpot VM和Exact VM,其中HotSpot在1999年4月誕生。
◦JDK 1.3 (2000-5):
▪增加了Java平臺的功能、底層類庫、增強了AWT和Swing用戶界面等。
當時Sun公司正在面對來自Microsoft的嚴峻挑戰,後者推出了.NET框架,試圖顛覆Java的地位。因此,Sun公司決定加快Java的開發速度,增強其競爭力。
◦JDK 1.4LST (2002-2):
▪引入Java管理擴展(JMX)、新的I/O API,稱為NIO(New I/O)、斷言、內置的XML解析器(SAX和DOM)等特性。
這是Java SE中功能最全面的版本之一。該版本引入了NIO和XML解析器等新特性,提高了Java程式的性能和擴展性。
◦JDK 5.0 / Java 1.5 (2004-9):
▪引入了泛型、枚舉類型、自動裝箱和拆箱、註解、併發編程API等特性。
這是Java SE中功能最豐富的版本之一。該版本引入了泛型、類型安全的枚舉、自動裝箱/拆箱和註解等新特性,使得Java程式的編寫更加簡潔和精簡。
Sun公司從這個版本開始放棄了謙遜的“JDK 1.x”的命名方式,將產品版本號修改成了“JDK x”。Sun 公司這樣做的原因是,從 JDK 5.0 開始,Java 平臺的發佈計劃每年發佈一個版本,為了避免版本號混淆,同時更好地傳達 Java 平臺的快速迭代和更新,採用了新的命名方式。
◦JDK 6 (2006-12):
▪引入了JDBC 4.0 API、Java監視與管理控制台(JConsole)、增加了對動態語言的支持、改進的GUI工具包(Swing)、改進的Java Web Start、改進的性能與安全性等特性。
JDK的更新沒有能夠繼續維持兩年發佈一個主版本的研發速度,這導致了JDK 6的生命周期異常的長。 Java 6 在銀行等體系使用比較多可能有以下幾個原因:
穩定性高:Java 6 是一個相對成熟和穩定的版本,由於經過多年的實踐和測試,已被廣泛認可並得到了驗證,符合金融行業對穩定性的要求。雖然 Java 7 和 Java 8 等新版本帶來了更多的功能和優化,但這些功能並不是每個銀行都需要,而且新版本的穩定性也需要一定時間的驗證和檢驗。
可控性強:銀行等體系對軟體的可控性要求非常高,需要確保軟體能夠穩定運行,並具備良好的可維護性。在這個方面,Java 6 較新的特性和更新也相對較少,使其相對容易維護和掌控。
成本考慮:對於一些大型機構,升級到最新的 Java 版本可能需要付出巨大的成本。例如,需要修改現有的代碼和應用程式、重新測試和審計等。另外,許多舊系統都還在運行 Java 6,升級到新版本需要重新評估風險和效益,這也需要額外的成本和投入。
總之,Java 6 在銀行等體系中使用較多是由於其穩定性、可控性和成本方面的考慮。然而,隨著時間的推移和新版本的推出,銀行等體系也需要逐步升級到更先進的 Java 版本,以滿足業務的需求和提高運行效率。
此外,雖然 Java 7 和 Java 8 帶來了更多的新特性和優化,但是在銀行等體系中升級到新版本需要付出巨大的成本,例如重新編寫和測試代碼、重新評估安全性等,這也是銀行等企業將 Java 6 作為開發平臺的一大原因。
◦JDK 7 (2011-7):
▪引入了switch語句的字元串表達式形式、二進位字面量和下劃線數字表示法、Try with Resources語句等特性。
在JDK 7開發期間,Sun公司相繼在技術競爭和商業競爭中陷入泥潭,公司的股票 市值跌至僅有高峰時期的3%,已無力推動JDK 7的研發工作按計劃繼續進行。為了儘快結束JDK 7長期跳票的問題,Oracle收購Sun公司後隨即宣佈馬上實行“B計劃”,大幅裁剪了JDK 7預定目標,以保證 JDK 7的正式版能夠於2011年7月28日準時發佈。
◦JDK 8LST (2014-3):
◦引入了Lambda表達式、Stream API、Date/Time API、介面預設方法、方法引用、重覆註解、Optional 類、Nashorn JavaScript 引擎等特性。
這是Java SE中最重要的版本之一,引入了Lambda表達式、Stream API、Default方法、DateTime API等新功能,極大地提高了Java程式的編寫效率和開發效率。 原定於2013年9月發佈,最終還是跳票到了2014年3月18日,從JDK 8開始,Oracle啟用JEP(JDK Enhancement Proposals)來定義和管理納入新版JDK發佈範圍的功能特性。
◦JDK 9 (2017-9):
◦引入了模塊化系統、JShell、HTTP/2客戶端和伺服器端API等特性。
發版節奏變更:以後JDK將會在每年的3月和9月各發佈一個大版本、每6個JDK大版本中才會被划出一個長期支持(Long Term Support,LTS)版,只有LTS版的JDK能夠獲得為期3年的支持和更新,JDK 8和JDK 11會是LTS版。 再下一個就到2021年發佈的JDK 17 了。
◦JDK 10 (2018-3):
▪引入了局部變數類型推斷、改進了Javadoc等特性。
2018年3月27日,Android的Java侵權案有了最終判決,法庭裁定Google賠償Oracle合計88億美元,要知道2009年Oracle收購Sun也就只花了74億,收購完成後隨即就用Sun的專利把Google告上了法庭,經過Oracle法務部的幾輪神操作,一場官司的賠償讓收購Sun公司等同免費。
◦JDK 11LST (2018-9):
▪引入了HTTP Client API(HTTP 客戶端API)、Nest-Based Access Control(基於嵌套的訪問控制)、Flight Recorder(飛行記錄器)、Epsilon GC(Epsilon垃圾回收器)改進的ZGC(Z Garbage Collector)等特性。
這是Java SE中長期支持版本中最新的一個版本,引入了HTTP客戶端、Local-Variable Syntax for Lambda Parameters、ZGC等新功能,具有重要的實用價值。 2018年10月,最後一屆JavaOne2018在舊金山舉行,這個1996年伴隨Java一同誕生、成長的開發者年度盛會落下帷幕。此外Java Mission Control(Java Mission Control (JMC)是一個由 Oracle 公司開發的用於監視、管理和分析 Java 應用程式的工具。)開發團隊也於6月被Oracle解散。
◦JDK 12(2019年3月):
▪引入了Switch表達式預覽功能、微基準測試套件等特性。
2019年2月,在JDK 12發佈前夕,Oracle果然如之前宣佈那樣在六個月之後就放棄了對上一個版本OpenJDK的維護,RedHat同時從Oracle手上接過OpenJDK 8和OpenJDK 11的管理權利和維護職責。
◦JDK 13(2019年9月):
▪引入了文本塊預覽功能、動態CDS歸檔等特性。
◦JDK 14LST(2020年3月):
▪引入了實例模式匹配預覽功能、非易失性記憶體支持等特性。
◦JDK 15(2020年9月):
▪引入了密封類預覽功能、Edwards-Curve數字簽名演算法等特性。
◦JDK 16(2021年3月):
▪引入了記錄類預覽功能、向量API等特性。
◦JDK 17LST(2021年9月):
▪長期支持版本,引入了模式匹配、密封類等正式特性。
◦JDK 18(2022年3月):
▪引入簡單的web伺服器、支持在Java API文檔中加入代碼片段、制定UTF-8作為Java API的預設字元集。
◦JDK 19 (2022年9月):
▪引入結構化併發的API來簡化多線程的編程、支持虛擬線程等。
◦JDK 20LST (2023年3月):
▪引入記錄模式、Switch模式匹配等。
3.當前市面JDK版本使用情況
New Relic近日發佈了一份《2023 年 Java 生態系統狀況報告》,這份報告收集了上百萬份線上的應用程式的數據,統計了目前生產環境中使用最多的JDK版本,最受歡迎的JDK供應商以及容器等的相關數據。
目前市面上有超過56%的應用程式使用了JDK 11,而相比之下,Java 8 的使用從2020年的84%降低到了現在的32%左右,大部分公司在這三年之間都升級到了JDK 11 或者 JDK 17這兩個LTS版本上面。
在JDK 的廠商上面,Amazon這兩年的增長量是比較大的,從22%上升到了31%,是目前市面上的各個JDK廠商中占比最高的。
4.總結
ok,以上就是截止目前所有的JDK版本及有關特性的簡要介紹,原本對各個版本的特性整理了一張腦圖,裡面有詳細的相關介紹,但是這塊如果全部都放到文章裡面會顯得過於冗長,emm,其實目前我們使用的JDK還是JDK8,前段時間通過對JDK的調研還對JDK9中的模塊化和JDK19中的虛擬線程進行了學習並使用實際demo對使用場景進行了驗證,相關分析會在後續文章進行介紹。
ps:文章末尾附錄一張腦圖照片~
作者:京東科技 宋慧超
來源:京東雲開發者社區 轉載請註明出處