的消息,在很長一段時間内都是開發者的讨論焦點,該項目在 Github 上的 Star 數迅速突破 1400。近日,Dragonwell JDK 8.0.0 正式釋出 GA 版本,這意味着其已經具備在生産環境正式運作的能力。

2019 年 3 月,Dragonwell JDK正式開源,釋出預覽 (Preview) 版本。近日,阿裡巴巴重磅宣布 Dragonwell JDK 8.0.0-GA 正式釋出,這意味着 Dragonwell JDK 已經完全具備在生産環境運作的能力。在過去三個月時間内,Dragonwell 收到了很多來自社群成員的回報。那麼,本次正式釋出的 GA 版本加入了哪些新特性?對開發者而言意味着什麼?
龍井 8.0.0-GA 的新變化
8.0.0-GA 的工作目的是為了讓 Dragonwell 盡快能夠在産品環境裡使用。在這個版本裡我們同步了 OpenJDK 上遊社群 jdk8u212-b04 的最新更新,這也意味着我們同步了上遊最新的安全更新和更新檔。
除了同步上遊,Dragonwell8 還修複了一些在阿裡巴巴的 Java 場景下發現的一些非常重要的 Bug,并且經受了阿裡巴巴内部場景的檢驗。同時我們也提供了一個預設的安全證書,這個證書我們會随時更新和維護。
熟悉 Dragonwell 的小夥伴可能都知道,Dragonwell 和 OpenJDK 上遊相比提供了一些專有的特性比如:JFR,JWarmUp 等。這些特性在阿裡巴巴内部得到了廣泛應用,為阿裡巴巴的 Java 業務的穩定運作立下了汗馬功勞,也可以說是 Dragonwell 的獨門武器。在 8.0.0-GA,我們也針對 JFR 特性做了一些修複和相容性上的改進。是以喜歡 Dragonwell 新特性的的社群小夥伴們可以放心大膽的使用它們了。我們堅信,這些新特性不僅能夠阿裡巴巴帶來價值,同時也能給社群的Java生态帶來價值。
8.0.0-GA 的釋出具體的内容大家可以參考 github 的 release notes,
戳這裡龍井的新征程
介紹完龍井 8.0.0-GA 的新變化,很多小夥伴已經躍躍欲試了。别忙,在使用之前我們再多唠兩句,作為龍井的家人,寶寶該如何成長,我們有着許多的想法,但龍井是社群的孩子,但我們也非常希望社群的小夥伴們能夠幫助它們變化成長。是以我們就一起談談龍井未來可能發生那些變化。
龍井的自從誕生開始,就吸引了社群的目光,尤其是 Dragonwell JDK 的一些新特性,幫助使用者在面臨業務挑戰時有了更多選擇。在今年 ISCA2019 Runtimes in the Cloud Tutorial 中,我們向社群和學術界彙報了 Dragonwell 在新特性上的工作進展,也得到了大家的積極響應。社群的回報也是我們下一步工作的動力,希望小夥伴多給意見。這個 talk 的介紹在這裡
http://www.cs.utah.edu/cloudruntimes/schedule.html#xiaomingppt 從這裡下載下傳
http://www.cs.utah.edu/cloudruntimes/slides/xiaoming.pdf有興趣的小夥伴可以看下。
Dragonwell 目前存在的幾個特性都是經過阿裡巴巴龐大 Java 場景的檢驗,在穩定性上是非常可靠的。下面我們就來具體談談這幾個特性。
JWarmUp
JWarmUp 這個特性是為了解決阿裡巴巴的雙 11 場景中搶購場景 Java 系統 Warmup 的痛點。以普通的 Java 應用舉例,JVM 需要經過解釋執行 (interpreter) 找到熱點,然後通過 JIT 編譯器來加速熱點方法的運作。對于高并發的場景,應用啟動之後會有很長的時間處于尋找熱點,編譯熱點的狀态,這時很多性能名額 (CPU 使用率, TPS 吞吐量, RT 響應時間)是不理想的。換句話,當 Java 應用啟動并提供服務之後,在相當長的時間内,處于一種 Warmup 的狀态,這時候雖然 Java 能夠對外提供服務,但服務的品質是比較差的,如果在這個階段使用者的并發比較高,那麼就往往會造成服務品質的降級乃至服務崩潰。
為了優化這個過程,通常的工業實踐會在 Java 啟動後引入"預熱" (Warmup) 這個步驟,通過一些人為導入的資料來讓應用提前加熱,在預熱完成之前,使用者的請求通過網絡控制不讓它發送到 Java 程序,在預熱完成之後才打開流量限制讓 Java 真正提供服務。這個做法可以部分緩解上述問題,但是這個方案在很多場景下會有一些局限性,這是因為很多情況下,擷取一份高品質的預熱資料是很困難的。而預熱資料的正确性直接影響到預熱的效果,與實際情況相符的資料可以提高編譯的品質,如果不一緻,有時反而會造成反面效果,比如一種常見的情況是預熱時會漏掉一些重要方法沒有被調用。更糟糕的情況是由于和實際情況不一緻,導緻 JVM “退優化”已編譯的方法,重新開始編譯,反而惡化了狀況。由此可見,如何準備預熱資料其實是一個挺複雜的問題,在實際運維中還沒有很好的解決方法。
Dragonwell 提出的 JWarmup 技術從 JVM 層面來解決這個痛點,基本原理是利用之前運作的情況找到熱點方法和 java class 資訊,之後的 JVM 運作執行個體可以利用上次的資訊來預熱,不需要通過人為資料來預熱。收集熱點的執行個體可以有多種選擇,例如在應用叢集中選擇一個節點,也可以在釋出過程中選擇一個 beta 釋出的階段來收集。相比之前“人為資料”的方式,主要有這幾個優勢:
- 收集熱點的時候可以利用真實資料,達到更好的編譯效果。
- 加速預熱的過程。由于熱點方法可以在加載後直接編譯,節省了解釋執行,profiling 等過程。
這個功能在 specjvm2008 的基準測試中,對于某些測試用例,跑分會有明顯提高:
# 标準OpenJDK在specjvm2008的xml.validation測試用例上的跑分
Score on xml.validation: 268.07 ops/m
# Dragonwell在specjvm2008的xml.validation測試用例上的跑分
Score on xml.validation: 294.95 ops/m
可以看出 Dragonwell 将 xml.validation 的跑分從 268.07 ops/m 提高到 294.95 ops/m,大概有10%的提高。
這個特性在阿裡巴巴的雙 11 搶購場景中得到了大量的驗證,可以說是 Dragonwell 的秘密武器。目前我們也正在社群努力推進,希望通過 JEP 的方式,把這個功能推進到上遊 OpenJDK 社群。畢竟好用的東西,不能隻有我們自己有,大家要共同富裕才是王道。目前這個 JEP Draft 正在社群 review 的階段,小夥伴如果覺得這個特性好用的話,也可以 OpenJDK 社群的郵件清單裡代表中國開發者為 Dragonwell 發聲。
JFR
JFR 全名是 Java Flight Recorder(Java 飛行記錄儀), 是 Dragonwell 的一個功能特性,當該功能被打開後,JVM 能夠以非常小的性能開銷記錄 Java 運作過程中産生的各種運作時資料。産生的 JFR 資料包含 JVM 運作時的各種微觀細節,可以被 JMC(Java Mission Control) 進行分析。JMC 是一個桌面應用程式,通過解析 JFR 資料,JMC 能夠高效快速的定位線上産品環境的各種故障。它能夠分析記憶體配置設定熱點,方法調用熱點,方法調用逾時分析,記憶體洩漏,IO 活動,線程活動等各個方面,幫助 Java 使用者保證服務的穩定。
阿裡巴巴日常開發過程中遇到的很多問題都是通過 JFR 得到解決的,可以說是 Java 故障診斷的一個利器。JFR 這個功能在 OpenJDK 11 以及以上的版本才有。在阿裡巴巴的推動努力下,JFR 功能已經開始被 OpenJDK 社群接受,計劃進 OpenJDK 8u 主線,目前社群的移植工作正在 incubator 分支緊張得進行當中,在不遠的将來,整個 OpenJDK 8 的下遊生态都可以享受這個工作成果。
Dragonwell 作為 JFR 在 OpenJDK 8u 社群工作的參與方,會源源不斷的把 JFR 的最新工作成果及時引入 Dragonwell,Dragonwell 的使用者可以說有福了。另外,除了 JFR 社群現有的功能,Dragonwell 在 JFR 上也做了很多增強和創新,一方面我們會積極把這些 JFR 的新特性回報給上遊 OpenJDK 社群,另外,在推動上遊的同時,Dragonwell 的使用者會天然的享有一些特别的福利:在上遊社群接受這些特性之前,Dragonwell 會最先開源這些新功能。
神秘嘉賓: ElasticHeap
最後就要介紹下我們的神秘嘉賓 ElasticHeap 了。Dragonwell 會源源不斷地把阿裡巴巴内部的一些創新特性回報到社群,ElasticHeap 就是繼 JFR,JWarmUp 之後,Dragonwell 帶着滿滿的誠意計劃開放的第三個新特性(進入下一個版本釋出),OpenJDK 社群也是沒有的哦。
大家知道,Java 作為進階語言會帶有垃圾回收器,随着程式的運作,Java 會把使用者配置的記憶體逐漸全部使用掉。即使這些 Java 程序後來變得比較空閑,不需要這麼多資源了,那這些被占用掉的記憶體也不會歸還給作業系統,從資源利用的角度,這會帶來某種意義上的浪費。而 Dragonwell 的 ElasticHeap 就改變了這種情況,這是一個基于 G1 GC 的動态堆彈性伸縮的功能,可以有效節約 java 程序實際實體記憶體占用。Openjdk8 僅支援在 Full GC 時按照一定規則歸還實體記憶體。而 Dragonwell 的 ElasticHeap 提供了更靈活有效的歸還記憶體的方式,有如下幾個特點:
-
不依賴 Full GC 和其他 STW 暫停處理彈性堆伸縮,不增加額外 STW 開銷,不影響 Java 線程服務。
2. 支援多種模式。
a. 根據記憶體配置設定速度和 GC 壓力自适應調整堆大小(自動歸還記憶體)
b. 根據 jcmd/MXBean 指令主動式限制堆的大小(可整堆限制或分代限制)
下圖是阿裡巴巴電商應用在雙 11 時使用 ElasticHeap GC 壓力自适應堆調整的應用的監控圖
- 圖中上半部分為 CPU 使用率,下半部分為實體記憶體使用率
- 雙 11 整點當服務流量進來時 (traffic peak starts),CPU 使用率大幅提升
- 同時開啟 ElasticHeap 堆記憶體自适應調整時,會配合 GC 壓力增大快速回漲堆記憶體;流量退去 CPU 使用率變小後,GC 壓力變小後,迅速的歸還實體記憶體
- 本例中,低流量時歸還實體記憶體約 20-30%
各位小夥伴們請期待吧,ElasticHeap 将在下個版本的釋出中揭開神秘面紗。
安裝使用
目前 Alibaba Dragonwell 隻支援 Linux x86-64 平台,開發者可通過如下步驟使用 Alibaba Dragonwell。
安裝 Alibaba Dragonwell
- 選項一:下載下傳預編譯 Dragonwell 二進制包
- 從 Alibaba Dragonwell 的 Github 頁面下載下傳二進制 tar 包,連結 https://github.com/alibaba/dragonwell8/releases
- 将下載下傳下來的 tar 包解壓到目标安裝目錄即可
- 選項二:使用 YUM 工具安裝
Alibaba Cloud Linux 2 YUM 倉庫已經正式支援阿裡巴巴 Dragonwell JDK,該 YUM 倉庫與 Aliyun Linux 17.1, Red Hat Enterprise Linux 7 以及 Centos 7 完全相容。
對于使用 Alibaba Cloud Linux 2 作業系統的使用者,隻需要執行
sudo yum install -y java-1.8.0-alibaba-dragonwell
就可以順利安裝。
如果使用者沒有使用 Alibaba Cloud Linux 2,但使用的 Linux 發行版和 Alibaba Cloud Linux 2 YUM 倉庫相容,那麼在
yum install
安裝前需要手動将 Alibaba Cloud Linux 2 YUM 倉庫添加到作業系統的 YUM 源裡去。添加的方法很簡單,隻需要在 /etc/yum.repos.d/ 裡添加一個包含如下内容的 alilinux-plus.repo 檔案即可。
# plus packages provided by Aliyun Linux dev team
[plus]
name=AliYun-2.1903 - Plus - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/alinux/2.1903/plus/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/alinux/RPM-GPG-KEY-ALIYUN
為 Java 應用啟用 Alibaba Dragonwell
對于使用預編譯 Dragonwell 二進制包的 JDK 使用者,隻需将應用腳本或者環境變量中的 JDK 目錄變量(一般是 JAVA_HOME) 指向上一步中安裝的 Alibaba Dragonwell 目錄。然後,重新開機應用以使用 Alibaba Dragonwell JDK 配置。
如果使用者是通過 YUM 工具安裝的 Dragonwell JDK,YUM 會在安裝過程提示 JDK 的使用方法,提示的内容如下
=======================================================================
Alibaba Dragonwell is installed to:
/opt/alibaba/java-1.8.0-alibaba-dragonwell-8.0.0.212.b04-1.al7
You can set Alibaba Dragonwell as default JDK by exporting the
following ENV VARs:
$ export JAVA_HOME=/opt/alibaba/java-1.8.0-alibaba-dragonwell-8.0.0.212.b04-1.al7
$ export PATH=${JAVA_HOME}/bin:$PATH
=======================================================================
總結
龍井 8.0.0-GA 的釋出宣告着 Dragonwell 進入一個新征程,越來越多的新特性将會被開源。也希望社群小夥伴們多多支援,龍井 JDK 将和整個中國的 Java 開發者一起,為增強國内 Java 生态力量而努力,讓中國開發者的聲音被全世界所傾聽。