Java 11正式釋出,新特性解讀

weixin_33858249發表於2018-09-26

不知不覺 JDK 11 已經發布了,從 9 開始,JDK 進入了讓人學不動的更新節奏,對於廣大 Java 工程師來說,真是又愛又恨,Java 演進快速意味著它仍將能夠保持企業核心技術平臺的地位,我們對 Java 的投入和飯碗是安全的,但同時也帶來了學習、選擇的困惑。

\\

所以,今天我們不準備做個流水賬的介紹,一起來看看工程師甚至是 IT 決策者最關心的問題:

\\
  • \\t

    JDK 更新如此頻繁,我是否要考慮升級? 新的釋出模式下,企業的 IT 策略需要做出什麼樣的調整?

    \\t\\t
  • \\t

    除了耍酷,JDK 11,或者說最近的 JDK 版本,有什麼真正值得生產環境中應用的特性?工程師要跟進嗎?

    \\t\

對於第一個問題,本人十分確信 JDK 11 將是一個 企業不可忽視 的版本。

\\

首先,從時間節點來看,JDK 11 的釋出正好處在 JDK 8 免費更新到期的前夕,同時 JDK 9、10 也陸續成為“歷史版本”,請看下面的 Oracle JDK 支援路線圖:

\\

7e393d00d11606fd2ba7b82e656e5e99.png

\\

JDK 更新很重要嗎?非常重要,在過去的很多年中,Oracle 和 OpenJDK 社群提供了接近免費的午餐,導致人們忽略了其背後的海量工作和價值,這其中包括但不僅僅限於:

\\
  • \\t

    最新的安全更新,如,安全協議等基礎設施的升級和維護,安全漏洞的及時修補,這是 Java 成為企業核心設施的基礎之一。安全專家清楚,即使開發後臺服務,而不是前端可直接接觸,程式語言的安全性仍然是重中之重。

    \\t\\t
  • \\t

    大量的新特性、Bug 修復,例如,容器環境支援,GC 等基礎領域的增強。很多生產開發中的 Hack,其實升級 JDK 就能解決了。

    \\t\\t
  • \\t

    不斷改進的 JVM,提供接近零成本的效能優化

    \\t\\t
  • \\t

    \\t\

“Easy is cheap”? Java 的進步雖然“容易”獲得,但莫忽略其價值,這得益於廠商和 OpenJDK 社群背後的默默付出。

\\

第二,JDK 11 是一個長期支援版本(LTS, Long-Term-Support)

\\

對於企業來說,選擇 11 將意味著長期的、可靠的、可預測的技術路線圖。有人說,那是對於付費訂閱客戶,不訂閱是不是就不用考慮 11 了呢?

\\

不,請放心,11 確定將得到 OpenJDK 社群的長期支援,目前 Oracle 提供了 OpenJDK build,雖然後續計劃未定,但是承諾“至少維護到明年”。即使是停止釋出後續 JDK11 更新,Andrew Haley 等社群專家也已經明確保證,會組建並領導“JDK-11-updates”專案,並且保證:

\\
\

“please let me assure you of one thing: whether by Oracle orRed Hat or someone else, JDK LTS releases will continue to be supported. We all have a lot invested in Java, and we won't let itfall.”

\
\\

所以,LTS 版本將是企業 IT 決策者可以放心選擇的版本。

\\

回到第二個問題,我們一起來看看 JDK 11 的有哪些能力上的突破,能夠讓我們覺得升級到 JDK 11 是超值的。

\\

從 JVM GC 的角度,JDK 11 引入了兩種新的 GC,其中包括也許是劃時代意義的 ZGC,雖然其目前還是實驗特性,但是從能力上來看,這是 OpenJDK 的一個巨大突破,為特定生產環境的苛刻需求提供了一個可能的選擇。例如,對部分企業核心儲存等產品,如果能夠保證不超過 10ms 的 GC 暫停,可靠性會上一個大的臺階,這是過去我們進行 GC 調優幾乎做不到的,是能與不能的問題。相信你對下面的資料已經不再陌生。

\\

7032e2dd11d0f6a98196ac037da88408.png

\\

關於 ZGC 特性的解讀已經非常多,本文不再重複。我在這裡主要介紹那些不起眼,但更具生產系統價值的部分。例如,對於 G1 GC,相比於 JDK 8,升級到 JDK 11 即可免費享受到:並行的 Full GC,快速的 CardTable 掃描,自適應的堆佔用比例調整(IHOP),在併發標記階段的型別解除安裝等等。這些都是針對 G1 的不斷增強,其中序列 Full GC 等甚至是曾經被廣泛詬病的短板,你會發現 GC 配置和調優在 JDK11 中越來越方便。

\\

雲端計算時代的監控、診斷和 Profiling 能力,這是個人認為比 ZGC 更具生產實踐意義的特性。

\\

不知道你有沒有注意到,不知不覺中 Java 的應用場景發生了天翻地覆的變化,從單機長時間執行的 Java 應用,發展成為分散式、大的單體應用或小的 function、瞬時或長時間執行等,應用場景非常複雜。

\\

我們還用什麼工具診斷 Java 應用? JConsole,JProfiler,還是“自研”的各種工具?目前的工具大多是從對單個 Java 應用的診斷視角出發,試想如果我們的叢集中有幾百、數千臺機器或容器,每臺機器有幾個或者幾十個 Java 程式,那麼:

\\
  • \\t

    怎麼在不干擾生產系統的情況下,高效地跟蹤海量的 Java 程式,準確定位可以優化的效能空間?

    \\t\\t
  • \\t

    如何保證“隨機出現”的 JVM 問題,不需要進行額外的、令人頭痛的“重現”?

    \\t\

JDK 11 悄悄地為我們提供了更加強大的基礎能力,主要是兩部分:

\\

JEP 328: Flight Recorder(JFR) 是 Oracle 剛剛開源的強大特性。我們知道在生產系統進行不同角度的 Profiling,有各種工具、框架,但是能力範圍、可靠性、開銷等,大都差強人意,要麼能力不全面,要麼開銷太大,甚至不可靠可能導致 Java 應用程式當機。

\\

而 JFR 是一套整合進入 JDK、JVM 內部的事件機制框架,通過良好架構和設計的框架,硬體層面的極致優化,生產環境的廣泛驗證,它可以做到極致的可靠和低開銷。在 SPECjbb2015 等基準測試中,JFR 的效能開銷最大不超過 1%,所以,工程師可以基本沒有心理負擔地在大規模分散式的生產系統使用,這意味著,我們既可以隨時主動開啟 JFR 進行特定診斷,也可以讓系統長期執行 JFR,用以在複雜環境中進行“After-the-fact”分析。還需要苦惱重現隨機問題嗎?JFR 讓問題簡化了很多哦。

\\

03f19059b813be7d5eb508d1480d409d.jpg

\\

在保證低開銷的基礎上,JFR 提供的能力也令人眼前一亮,例如:

\\
  • \\t

    我們無需 BCI 就可以進行 Object Allocation Profiling,終於不用擔心 BTrace 之類把程式搞掛了。

    \\t\\t
  • \\t

    對鎖競爭、阻塞、延遲,JVM GC、SafePoint 等領域,進行非常細粒度分析。

    \\t\\t
  • \\t

    甚至深入 JIT Compiler 內部,全面把握熱點方法、內聯、逆優化等等。

    \\t\\t
  • \\t

    JFR 提供了標準的 Java、C++ 等擴充套件 API,可以與各種層面的應用進行定製、整合,為複雜的企業應用棧或者複雜的分散式應用,提供 All-in-One 解決方案。

    \\t\

而這一切都是內建在 JDK 和 JVM 內部的,並不需要額外的依賴,開箱即用。

\\

另一方面,就是同樣不起眼的 JEP 331: Low-Overhead Heap Profiling。我們知道,高效地瞭解在 Java 堆上都進行了哪些物件分配,是診斷記憶體問題的基本出發點之一。 JEP 331 來源於 Google 等業界前沿廠商的一線實踐,通過獲取物件分配的 Call-site,為 JDK 補足了物件分配診斷方面的一些短板,工程師可以通過 JVMTI 使用這個能力增強自身的工具。

\\

從 Java 類庫發展的角度來看,JDK 11 最大的進步也是兩個方面:

\\

首先,是難得的現代 HTTP/2 Client API,Java 工程師終於可以擺脫老舊的 HttpURLConnection 了。新的 HTTP API 提供了對 HTTP/2 等業界前沿標準的支援,精簡而又友好的 API 介面,與主流開源 API(如,Apache HttpClient, Jetty, OkHttp 等)對等甚至更高的效能。與此同時它是 JDK 在 Reactive-Stream 方面的第一個生產實踐,廣泛使用了 Java Flow API 等,終於讓 Java 標準 HTTP 類庫在擴充套件能力等方面,滿足了現代網際網路的需求。

\\

第二,就是安全類庫、標準等方面的大範圍升級,其中特別是 JEP 332: Transport Layer Security (TLS) 1.3,除了在安全領域的重要價值,它還是中國安全專家範學雷所領導的 JDK 專案,完全不同於以往的修修補補,是個非常大規模的工程。

\\

除此之外,JDK 還在逐漸進行瘦身工作,或者償還 JVM、Java 規範等歷史欠賬,例如

\\

其中最值得關注的是 JEP 335,它進一步明確了 Graal 很有可能將成為 JVM 向前演進的核心選擇,Java-on-Java 正在一步步的成為現實。

\\

JDK 11 還有什麼遺憾嗎?很多 Valhalla、Loom、Panama 等專案中繼續補齊的短板,如協程、Value Type 等,目前還是可望而不可即,也許令人欣慰地是,我們能看到 Java 能夠正視自身存在的不足,不斷飛速發展。

\\

從 1995 年第一個版本釋出到現在,Java 語言已經在跌宕起伏中走過了 23 年。這 23 年,既有 Java 連續霸榜多年的風頭無兩,也有近兩年 Java 不可忽視的頹勢。Java 是最好的語言嗎?不是,每個領域都有更合適的程式語言,沒有無所不能的存在。

\\

Java 語言到底有什麼優勢可以佔據排行榜第一的位置呢?

\\

其一,語法比較簡單,學過計算機程式設計的開發者都能快速上手,JVM 也為開發者遮蔽了大量複雜的細節。其二,能力過硬,在若干個領域的競爭力都非常強,比如服務端程式設計,高效能網路程式,企業軟體事務處理,大資料,分散式計算,移動、嵌入終端應用開發等等。最重要的一點是其吸收了了業界領先的工程實踐,構建從嵌入式裝置到超大規模軟體系統的能力,充分得到了實踐驗證。所有這些都使得 Java 成為企業軟體公司的首選,也得到很多網際網路公司的青睞。時移世易,Java 正在也必須改變。

\\

Java 改為每半年發版一次以後,在對合並關鍵特性、快速得到開發者反饋等方面,做得越來越好,我們明顯能夠看到各廠商和社群對 Java 投入的提高。最新發布的 JDK 11 雖然談不上劃時代的進步,但一定是 JDK 發展歷程中的一個重要版本,升級 JDK 就可以獲得的效能等各種提高,基礎能力的全面進步和突破,這一切無不說明,是時候開始評估並開始計劃升級到 JDK 11 了。

相關文章