2019 年 Java 和 JVM 生態系統預測:OpenJDK 將成為 Java 運行時市場領導者
本文對 2019 年 Java 和 JVM 生態系統做了一些預測。
正如 InfoQ 2018 年度總結 中說的那樣,Java 在 2018 年的發展勢頭非常有意思。
在我們步入 2019 之際,讓我們來看看在新的一年中 Java 和相關技術值得注意的點,并試著猜測未來會發生些什么。
免責聲明:以下猜測僅僅是作者個人做出的,并不是來自 Oracle、InfoQ 或其他方面的官方聲明或路線圖。
Java 11 將出現小規模但意義重大的采用
有關這個預測的爭議是最小的。Java 9 和 Java 10 在生產環境中的部署量很小,很多團隊似乎都在等待后 Java 8 LTS 版本的發布,現在它來了,Java 11 的采用將會以小而穩的速度開始。
導致 Java 11 被采用的一個推動因素是微服務和容器化的應用程序,使用 Java 11 實現二者都比使用 Java 8 來得容易。在部署全新的應用程序時,Java 11 顯然是團隊更好的選擇。
預測:到 2019 年底,Java 11 安裝率將占據 Java 產品安裝總量的 10% 左右。
Java 8 應用程序不會大規模遷移到 Java 11
到現在為止,Java 應用程序更新路徑都是相對清晰的。從 Java 6 到 Java 7,從 Java 7 到 Java 8,幾乎可以說是沒有障礙的。但是從 Java 8 到 Java 11 并不是這樣的,要將重要的應用程序遷移到新版本需要做大量的工作。
只有很少團隊具備足夠的資源用于遷移、重構和重新測試應用程序。因此,如果沒有足夠的外部理由,我不認為今年會有大規模 Java 8 應用程序被遷移到 Java 11 上。
預測:沒有具體的可量化預測。
不會出現類似于 Python 2/Python 3 的分裂
很多人已經討論過這個可能性,即隨著 Java 模塊化的出現,Java 生態系統可能會出現類似于 Python 社區已經經歷過的 Python 2/Python 3 分裂。
但我并不認為會發生這種情況,因為從根本上說,在語法和語義層面,Java 11 并非一門完全不一樣的語言。Python 的不同版本之間在語法和關鍵數據類型(比如說 Unicode 字符串或長整型)方面發生了變化,所以庫和應用程序作者必須有意識地選擇使用哪個版本,這種選擇蔓延到了整個生態系統中。
但對于 Java 來說,應用程序所有者需要決定是否要接受模塊化,而庫開發人員需要決定是否作為模塊進行部署,如果是的話,需要為 Java 8 應用程序提供什么樣的回退措施。對 Java 程序員來說,工作大致和之前相同,無論項目是基于 Java 8 還是 Java 11,基本上還是使用相同的語言進行編程。
預測:沒有具體的可量化預測。
漸進式的 Graal 采用
已經遷移到 Java 11 的項目可能也會關注 Graal。Graal 提供了下一代 JIT 編譯器,新編譯器可能會在 2019 年達到(甚至超過)Java 11 的 C2 編譯器(即 -server)水平。
Graal-JIT 遲早會超過 C2,Graal 的設計(特別是它是用 Java 實現的)意味著 Graal 團隊可以很容易地實現任何 C2 可以實現的新優化。
“Graal”還包含了 Oracle 半開放的多語言運行時 GraalVM。不過需要注意的是,Graal-JIT 僅適用于 Java 11 及以上版本,而 GraalVM 僅涵蓋了 Java 8。
因此,Graal 用戶社區可能會分為兩個部分,一部分關注 Java 11 應用程序的性能,一部分關 Java 8 生態系統的多語言應用程序。
預測:30% 到 40% 的 Java 11 應用程序將在生產環境中使用 Graal-JIT。
討論是否將 Graal 作為 Java 13 的默認 JIT 編譯器,但最后未能實現。
GraalVM 在生產環境的部署還是很少,但會有越來越多的應用程序團隊開始嘗試使用它。
OpenJDK 成為 Java 運行時的市場領導者
Oracle 宣布終止對 OpenJDK 8 項目的所有權,Red Hat 提出要接管該項目。OpenJDK 11 項目可能也會一樣,在 Java 12 發布的時候,Oracle 將會放棄這個項目。
很多開發人員沒有注意到 Oracle 的 LTS 產品僅針對付費用戶,所以將來對 Java 8(以及 Java 12 發布后的 Java 11 版本)的支持不會是由 Oracle 組織來提供,而是由 Red Hat、Amazon、Azul Systems 以及多廠商和社區驅動的 AdoptOpenJDK 項目 來提供。
由于不再有免費的 Oracle JDK 發布到社區,我預測人們會快速將 OpenJDK 作為 Java 應用程序的生產平臺。
好消息是,對于服務器端應用程序(以及越來越多的 Java 桌面程序),OpenJDK 也是 Oracle JDK 的替代品。
預測:到 2019 年底,超過 50% 的 Java 8 和 Java 11 生產運行時會使用 OpenJDK 而不是 Oracle JDK。
Java 12 的發布
Java 12 功能已經確定 ,將在 2019 年 3 月發布。除非有重大事件的發生,否則這次發布會按時進行。
這不是長期支持的版本,不太會被廣泛采用(就像 Java 9 和 Java 10 沒有被廣泛采用一樣)。
預測:Java 12 按時發布,并在 2019 年底出現少量的生產部署。
Java 13 發布
Java 13 將在 2019 年 9 月發布。目前對于該版本將包含哪些功能并沒有太多相關信息。
和 Java 12 一樣,它是一個功能發布版本,并非 LTS 版本。因此,現在沒有理由認為它無法按時發布。同樣,它也不會被廣泛使用,團隊會更關注于遷移到 Java 11。
預測:Java 13 按時發布,并在 2019 年底出現少量生產部署。
值類型不會在 Java 13 中預覽發布
值類型是除原始類型和對象引用之外的第三種 JVM 基礎類型。這個概念可以被認為是放寬了 Java 類型系統規則,可以像 C 語言的結構體那樣組合數據結構,同時保證完整的 Java 類型安全。
Java 語言架構師 Brian Goetz 用“ 代碼像類,功能像 int ”這樣的話來描述他想象該特性發布以后一個典型的開發人員會如何使用值類型。
實現值類型的努力一直在繼續,但到 2018 年底,只出現了試驗性、非常早期、只有專家使用的測試原型。
這一點也不奇怪,值類型是 Java 平臺最根本和最深入的變更之一。
這一功能的復雜度和期望度以及所涉及的大量工程工作使得它不太可能在 2019 年內交付。
預測:即使在 Java 13 預覽功能中也不可能出現任何形式的值類型。
match 表達式首個版本將在 Java 13 中預覽發布
switch 表達式是 match 表達式的先決條件。如果語法中沒有表達式形式,match 表達式也不可能出現在 Java 中。事實上,如果沒有 match 表達式,那么引入 switch 表達式也就變得沒那么重要。
因此,我預測標準的 switch 表達式推出后,緊隨其后會出現簡單的 match 表達式。該功能剛開始可能僅限于類型匹配,不包含解構或其他高級功能。
預測:在 Java 13 的預覽功能中會包含初始、有限的 match 表達式。
Kotlin 適度增長
來自 JetBrains 的 Kotlin 語言 在最近幾年里獲得了越來越多開發人員的關注。特別是在 Android 領域出現了爆發式增長,Android 領域的新項目改由 Kotlin 主導。
然而,在服務器端 Java 方面并沒有出現類似的爆發性增長。在 2019 年,我預計 Kotlin 的使用會穩定增長,但并不會有大量項目或團隊突然轉向使用 Kotlin。會有一些高知名度的項目公開使用 Kotlin。
預測:Kotlin 將持續獲得 Java 核心社區成員的追捧,但并不會發生爆發式增長,規模還是比 Scala 生態系統小。
一如往常
上面提到了 Java 比較突出的一些變化。然而,在 Java 世界腹地,未來一年中將大致保持不變。Java 的 IDE、庫和生態系統的其余部分將大致保持相同。
Java 在業內將繼續保持穩固地位和發展趨勢,并不會出現什么重大轉折。
預測:沒有具體的可量化預測。