1. 程式人生 > >阿里巴巴開源 Dragonwell JDK 最新版本 8.1.1-GA 釋出

阿里巴巴開源 Dragonwell JDK 最新版本 8.1.1-GA 釋出

導讀:新版本主要有三大變化:同步了 OpenJDK 上游社群 jdk8u222-ga 的最新更新;帶來了正式的 feature:G1ElasticHeap;釋出了使用者期待的 Windows 實驗版本 Experimental Windows version。

距離 Dragonwell JDK 第一個正式版本 8.0.0-GA 釋出已經過去 3 個月了,專案在 Github 上的 stars 繼續攀升達到了 1900。今天我們帶來了最新版本 8.1.1-GA 的釋出,包含了全新的特性和更新。詳情見下文。

龍井 8.1.1-GA 的新變化

新版本里我們同步了 OpenJDK 上游社群 jdk8u222-ga 的最新更新,帶來了上游穩定版本的最新安全更新和補丁。

在 8.0.0-GA 釋出的時候,我們介紹了 Dragonwell 第三個新特性 ElasticHeap 的一些情況,很多使用者已經躍躍欲試了,這次釋出我們帶來了正式的 feature:G1ElasticHeap。能夠在不影響 Java 業務執行的前提下,動態節約 Java 程序實體記憶體。

另外,我們還發布了使用者期待的 Windows 實驗版本 Experimental Windows version,使用 Windows 開發的小夥伴們可以更加方便的使用 Dragonwell JDK 進行相應的開發工作。

G1ElasticHeap

從 feature 的名字上我們可以看到 ElasticHeap 是基於 G1 GC 開發的,所以想要使用這個功能的小夥伴,需要開啟 G1 GC(-XX:+UseG1GC)。在 8.0.0-GA 正式版介紹時,我們介紹了部分技術背景,由於 Java 自動管理記憶體的特性,整個 Java Heap 的地址空間和實體記憶體將被 Java 程序佔用,即使使用率不高,回收後也並不會歸還給作業系統,導致 Java 程序會有較高的常駐記憶體。

OpenJDK8 的幾個常規 GC 演算法僅能支援在 Full GC 時,按照一定規則有限縮減 Java 堆,然而 Java 開發的小夥伴們非常清楚,頻繁的 Full GC 的 STW(stop-the-world)對 Java 應用意味著什麼,長暫停會導致很多不可預期的應用異常和無法響應。

ElasticHeap 可以根據整體 GC 的壓力,敏捷地將 Java 堆的實體記憶體歸還給作業系統,沒有額外的 STW 對 Java 應用帶來的超時異常風險,核心設計有 2 個特別之處:

  1. 分別處理 Java Heap 中新區和老區的部分。特別是不少應用為了維持可能高壓力下的 GC 吞吐,會保持比較大的 young generation,例如 G1 預設的新區最大值為整堆的 60%。當 young GC 頻率不高時,其實 Java 堆面臨很大程度的浪費,但卻沒有辦法快速節約這部分記憶體。假設當新區為整堆 60%,young GC 頻率為 90 秒一次。當使用整堆 10% 作為 young generation 時,GC 頻率變為 15 秒一次,同樣可以滿足 Java 正常執行,這樣就可以節約 50% 的 Java 堆記憶體。而當壓力變大,GC 頻率變高時,會自動檢測到變化並且重新 map 記憶體擴充套件新區的大小。

  2. 使用了併發執行緒,併發且並行(concurrent and parallel)處理記憶體歸還和重新 map 的工作。因為和 Linux kernel 互動,map/unmap 記憶體實際上是比較耗時的操作,特別是重新 map 記憶體後還會有 page fault 的開銷,對於一次操作上 G 的記憶體,很容易消耗上百毫秒,甚至是秒級。因此,如果傳統地在 GC STW中 操作記憶體 map/unmap,Java 應用將可能發生較大的毛刺,這是很多線上服務型應用不可接受的。通過併發執行緒並行處理 unmap 以及重新 map 後帶來的 page fault 的開銷,Java 應用執行緒將不受任何影響。在常規 GC STW 過程中,Java 堆的容量將會及時同步完成。

在 OpenJDK 新的 12 版本中,也引入了週期性觸發 G1 concurrent mark 來觸發記憶體的節約機制,但是並沒有解決在 STW中map/unmap 的開銷問題,也不能快速在 young GC 週期中來發現和處理 young generation 的記憶體浪費。目前除了在 Dragonwell 8.1.1 中釋出,我們同時把 G1ElasticHeap 的 patch 提交給 OpenJDK 社群 review 和討論,希望將這些創造性的變化加入到最新的 OpenJDK G1 GC 中。

雲棲大會上孤盡的演講,清晰地描述了 ElasticHeap 的使用場景。在雙 11 流量劇增的情況下,核心應用 tradeplatform3 迅速的回漲 Java heap 和記憶體,以保持高流量壓力下的穩定。高峰過後,記憶體逐漸縮減。從叢集維度來說,線上 Java 應用佔據大量記憶體,即使線上流量低,cpu 利用率很低,由於記憶體的佔據,叢集機器的 cpu 資源依然無法複用。而 ElasticHeap 可以有效降低低壓力的線上 Java 應用的記憶體佔用,把記憶體資源出讓一部分執行離線任務,從而突破線上應用叢集的資源利用率的記憶體瓶頸。在本例中,節約了 22.8% 的 Java 程序的實體記憶體。

想要立刻使用最新特性的小夥伴們,可以通過下面的地址下載最新版本的 Dragonwell JDK 的二進位制包。
https://github.com/alibaba/dragonwell8/releases
這裡提供了使用者指南和釋出說明。使用者指南的末尾還有支援的釘釘群和郵件。
https://github.com/alibaba/dragonwell8/wiki

如果有小夥伴覺得這個特性符合自身的場景需求好用的話,不妨也向 OpenJDK 社群郵件列表支援我們,讓 OpenJDK 聽到更多中國 Java 使用者和開發者的聲音。

“ 阿里巴巴雲原生微信公眾號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術公眾號。”