(給ImportNew加星標,提高Java技能)
轉自:開源中國
作為繼 Java 8 之後的第一個 LTS 版本,Java 11 的釋出引起了廣泛關註,一方面是因為這個版本帶來了一些重要的新特性,比如熱議的 ZGC、HTTP/2 Client、Flight Recorder 等,在記憶體管理與 JVM 診斷/Profiling 等方面都有很強的能力突破。
另一方面是因為 Oracle 針對 Java 的一系列動作,比如宣佈變更版本迭代週期、修改了商業支援方式,推出訂閱樣式、在兩種不同的 License 下提供 JDK 釋出版……這持續性的變化讓大家不斷困惑,開發者不知道還能不能愉快地免費使用 Java,也不清楚接下來將會面對一些什麼。
雖然 Oracle 官方有解釋,並且也有 30 幾位 Java 社群領袖與專家聯名發表了一篇文章,詳細分析了 Java 其實還是免費的等相關問題,但是因為普遍存在語言與網路障礙,並且也有理解上的偏差,再加上一些自媒體的過度製造焦慮,使得本身就複雜的問題變得更加難以理解。
在前陣子開源中國舉辦的技術會議“源創會年終盛典”上,資深 Java 專家楊曉峰為與會者帶來了針對 Java 11 的最新解讀,帶領大家重新認識了現代 Java。
楊曉峰是 OpenJDK Committer,目前在京東擔任大資料中心架構師,曾領導 Oracle 北京 Java 核心類庫等團隊,參與甚至負責過 Java 8~11 核心類庫等部分新特性的相關任務。
我們藉此機會邀請他為大家把 Java 這令人困擾的事理清楚了。
楊曉峰一開始就直接來了一句:Java 還是免費的。話是這麼說,但實際上這並不足以打消疑慮,也存在一些更加具體的問題需要解釋,具體是怎麼回事呢?
相關概念
首先要理清一些概念,一方面是 Oracle JDK 面向的使用者型別:
- Oracle客戶,主要是指那些購買了 Oracle Java SE 相關服務支援的使用者,比如,透過前邊講到的訂閱樣式購買服務的客戶。
- 商業使用者,免費使用 Java 用於商業目的的物體。
- 個人使用者,在個人電腦上,免費使用 Java SE,以及不用於商業目的開發人員。
當前大部分使用 Oracle Java 的開發者/所在公司是屬於哪一種型別的使用者呢?是第二種——商業使用者。
再來看看關於“Oracle 的 Java”。一方面,Oracle 主導著 OpenJDK 社群,它本身自己做了一個叫 Oracle JDK 的產品,這是它的商業產品,也是目前最為廣泛使用的 JDK;另一邊,Java SE 9 以來,Oracle 也提供 Oracle 的 OpenJDK 發行版 Oracle’s OpenJDK,而這個 Oracle’s OpenJDK 就是完全開源免費的,可以用於商業用途。
楊曉峰解釋:
OpenJDK 是基於 GPL v2 的開源專案,從 Java 7 開始,就是 Java SE 的官方參考實現。狹義上的 OpenJDK 往往是指基於 OpenJDK 構建的發行版,各個主流廠商的 JDK 產品基本上都是基於 OpenJDK 原始碼,或多或少增加自己的定製內容。Oracle JDK 是 Oracle 提供的商業 JDK 實現,是目前應用最廣泛的 JDK,在 JDK 11 之前,Oracle JDK 與 Oracle’s OpenJDK 除了一些強大的商業特性,還有 CA 根證書等便利性內容和細微差別。從 JDK 11 開始,Oracle JDK 使用原來的商業 BCL License,而 Oracle’s OpenJDK 開始獨立改用 GPL v2+CPE License,二者提供同樣的功能,本質上沒有不同,但是不同的 License 針對不同使用者。
Java 8 更新不再免費
像前邊所說,關於 Java 的使用困惑是一波接一波的,首先是 Oracle 公告從 2019 年 1 月以後,將不再為商業使用者提供免費的 Java SE 8 更新服務。商業使用者可以使用 Oracle Java SE 訂閱樣式繼續享受更新支援;而個人使用者不受影響,還可以繼續享受免費更新到 2020 年 12 月。
楊曉峰解釋:
這本來其實就是一個正常的軟體生命週期結束(EOL),不必過度解讀,Oracle 已經免費支援了 5 年 JDK 8 了。OpenJDK 有一個約定成俗的做法,就是經過多年免費支援以後,Oracle JDK 版本會進入 End of Life,也就是生命週期結束 EOL,然後由社群接手並主導後續更新事務。之所以目前只有這個 Java 8 的 EOL 導致恐慌,主要是因為這個 Java 8 太成功了,相當多使用者還沒有準備好,也沒有足夠動力去升級 JDK,這就像目前還使用 Windows XP 的使用者,無法獲取官方更新,但是還是很多使用者停留在上面。另外一個不容忽視的原因是,Oracle 顯著縮短了其提供後續 JDK 版本的免費支援週期(目前建議為半年),社群會承擔長期支援版本(LTS,Long-Term-Support)的後續更新工作。
所以實際上,開發者其實不太需要去關註 Java 8 收不收費這麼一個問題,真正需要關註的人是企業 IT 決策者。一方面,個人開發者使用 Java 8 還是一樣免費,還是一樣可以獲得更新支援;另一方面,所謂的收費,其實指的是在 2019 年 1 月之後的更新要收費支援,Java 8 本身就還是免費的,而要不要使用訂閱樣式去繼續獲得更新這是 IT 決策者要考慮的。
那麼企業 IT 決策者可以怎麼考慮呢?
楊曉峰介紹:
- 付費的選項,除了 Oracle,還有其它廠商也提供了商業的 JDK 發行版,包括 Azul、IBM等,具體選擇要看企業自己的判斷。
- 不希望付費的使用者,Java SE 9 以來,Oracle 也提供 Oracle 的 OpenJDK 發行版 ,基於 GPL v2 協議,總體免費更新週期比較短,AdoptOpenJDK 會提供更長期的免費支援。當然,也有個別廠商宣告會提供長期的 JDK 8 更新,可以參考 Amazon Corretto。
同時我們也註意到,因為目前早已過了 2019 年 1 月份,也就是到了 Java 8 免費更新結束的日子,有一些公司的響應也被公佈出來,比如這個:
楊曉峰表示:“這個公告比較專業也比較謹慎,我認為 8u201/202 是最後的一個免費 Oracle JDK 8 更新。涉及到 License 相關的決策,嚴格來說這不僅是個技術決定,更是個法務相關的決定。”
所以,總結下來,真正需要關註 Java 免費問題的是企業 IT 決策者,而且他們目前有上邊講的幾種方案可選:
- 使用訂閱服務,花錢獲得 Java 8 更新
- 花錢使用其它廠商提供的商業 JDK
- 選一個 OpenJDK 發行版遷移過去,由開源社群提供更新支援
- 保持在 8u201/202 或者之前版本
楊曉峰還強調:“授權(License)和付費是商業行為,是企業的 IT 決策,本就應該是由專業人士來做的,耐心、客觀一些,不要被自媒體收智商稅。”
釋出週期變化
其實 Oracle 早在 2017 年 9 月份就宣佈改變 JDK 版本釋出週期,這之後也陸續釋出了 Java 10 與 11,12 也快要到來。
楊曉峰介紹,新的版本釋出週期中,改變了以特性驅動的方式,變成以時間驅動版本變化。每 6 個月就會釋出一個新的 Java 版本,也就是“大版本”,同時每 3 年會出現一個 LTS 版本,Java 11 作為這個新樣式的第一個 LTS。
取用相關材料可以大概看到,新的版本週期與舊有樣式的變化:
這其實是一件好事,而且也沒有什麼好睏惑的。對於企業來說,技術棧的未來可預測性和可靠性是非常重要的,它可以保證研發投入的安全性和能力。對於 Java 來說,這一點其實也已經在過去 20 多年其生態圈的長期持續投入中獲得了印證。
“Java 新的釋出樣式中,由於 LTS 的存在,對於企業 IT 決策提供了清晰的指引”,楊曉峰表示:“與此同時,新的樣式加快了新技術迭代和落地,以便更加敏捷地適應雲端計算等新浪潮,這事實上提高了企業的參與度和生態活力。”
為什麼不直接用 Java 11?
既然 Java 11 新特性強悍,並且也是集萬千關註,那為什麼那麼多人都不願意從 Java 8 升級到 Java 11 呢?直接不用 Java 8 的話,也就沒有上邊那些更新問題了。
其實關於 Java 還有一件事情挺神奇的,在關於目前正在使用哪個版本的 Java 的各種大大小小的調查中,很多人都表示公司正在使用很落後的版本,管你 Java 11 最新特性多厲害,反正就是要堅守 Java 1.4、5.1……這是一種比較普遍的現象,實際上調查資料顯示目前 Java 8 是最被廣泛使用的版本。
對此楊曉峰認為軟體升級本就不是一蹴而就的事,尤其是基礎軟體,就像伺服器作業系統的升級,也是一個緩慢的過程,他解釋:“雖然 Java 在相容性上總體做得很好,但升級總是需要人力等成本的,未必是企業的當務之急。相信未來這種情況一定會持續下去。”
但是與之形成對比的是,除了這些“滯後”的現象,當然也有在相關方面積極投入的公司企業,比如谷歌、亞馬遜與阿裡等,與其被動接受變化,不如自己主動往前一步,去引導變化。楊曉峰以其所在的京東大資料平臺部為例介紹:
京東大資料平臺有業界少有的超大規模 Hadoop、Spark、Kafka 等叢集,承載著海量的資料和計算負載,在 Java/JVM 領域有一些比較深入的工作,例如:
- 透過 JVM 層調優,不斷獲取通用性的計算資源效率提升,節省大量資源。例如,透過對 Spark Streaming 執行情況的深入分析,我們進行了 JVM 調優,在記憶體等計算資源減少 20% 的情況下,吞吐量還提高了 10+%。
- 對於 Java 相關程式碼實踐的持續改進,提高研發、運維效率和產品質量。
- 透過對大資料基礎引擎等程式碼層面最佳化,相對於開源社群產品,我們取得了大百分比甚至是倍數級別的效能等提升 。以 Kafka 為例,大資料中心團隊透過 Profiling 技術,進行程式碼層面的一個深度改進,就使得吞吐量提高 40%,CPU 消耗降低 5%。整個叢集 1400 多臺,按照通常每臺伺服器 48 核/256 G 記憶體來計算,單是這個最佳化的經濟效益就是千萬級人民幣。
因為並未刻意進行宣傳,也許很少有人知道,我們已經簽署了 OCA 協議,並積極參與到了 OpenJDK 等社群貢獻中,目前已經貢獻了若干效能和功能性的增強到 OpenJDK 等開源社群。
Java 在新時代
關於繼續使用 Java 接下來將會面對一些什麼,除了上邊講到的版本週期變化、商業支援方式改變和開源許可的變化等,其實還有一個方面值得關註,那就是技術上的東西:Java 當前的問題與未來的方向。
Java 多年來在各個程式語言排行榜上一直是穩坐第一把交椅,但是最近有一些榜單上 Python 都已經走在 Java 之前,並且在逐漸拉開差距。這其中很大一部分原因可以歸為 AI 以及相關的資料挖掘、分析等領域的快速崛起。
同時,另一方面,隨著雲時代不斷發展,像 Golang 這樣原生具有高併發、語法易學等各方面優勢的語言也在不斷壯大勢力、完善能力。
那這就帶來了問題:AI 與雲端計算等領域當下快速發展,會不會對 Java 造成衝擊?Java 在這樣的新時代可以與其它程式語言區分開的明顯優勢有哪些?
對於這些問題,楊曉峰認為目前 Java 龐大的生態系統,包括最龐大的開發者群體、海量的類庫/工具等、主流廠商的參與和投入,都是其明顯的優勢。
比如據不完全統計,目前 Java 開發者超過了 1200W,活躍的 JVM 有 380 億+,同時連線到雲的 JVM 有 210 億+。
很多人認為 Java 慢,但是楊曉峰反駁:“拋開場景說快慢是沒有意義的。”
他解釋:“目前來說,長時間執行的伺服器端場景下,Java 是處於沒有爭議的霸主地位的;而在微服務等新型架構下,Java/JVM 依然還是首選;並且,當前雲端計算時代,Java 也是 No.1 的程式語言,它改寫了電商、大資料、企業軟體、移動,甚至 IoT 等領域;此外,各個大公司也都在相關方面積極投入,包括但不限於谷歌、阿裡、亞馬遜、IBM、Oracle 與京東。”
除了這些優勢,楊曉峰也坦言,目前 Java 還是有面臨挑戰的,“最大的問題在於 Java 是否能夠快速地調整自己的能力,以保證在新場景下的競爭力”,他說:“排行榜/衝擊都只是競爭的表現而已,能力才是更加重要的決定成敗的關鍵因素,簡單說就是——效率!效率!效率!”
在面對這些挑戰的時候,Java 在不斷改造自身,以適應新時代的需求,楊曉峰介紹 Java 現在快速演進的領域主要有:
更輕量級的 JVM,以適應雲端應用需求。微服務與 Serverless 等都是短時間、輕量級的應用;
- 進一步增強資料密度、資料結構等基本能力的 value types 等;
- 變得更具開發效率的語法;
- 更具擴充套件性和更高開發效率的併發基礎設施,如 Java 版協程 Fiber;
- 此外還有底層、硬體級別開發效率和能力急需的 Panama 等等。
總之,楊曉峰認為,在新時代,雖然還是需要不斷跟進,不斷去快速調整自己的能力,但是 Java 還是Java 還是排在第一的程式語言,未來可期。