今年 3 月份,阿里巴巴重磅開源 OpenJDK 長期支持版本 Alibaba Dragonwell 的消息,在很長一段時間內都是開發者的討論焦點,該項目在 Github 上的 Star 數迅速突破 1400。近日,Dragonwell JDK 8.0.0 正式發佈 GA 版本,這意味着其已經具有在生產環境正式運行的能力。html
2019 年 3 月,Dragonwell JDK正式開源,發佈預覽 (Preview) 版本。近日,阿里巴巴重磅宣佈 Dragonwell JDK 8.0.0-GA 正式發佈,這意味着 Dragonwell JDK 已經徹底具有在生產環境運行的能力。在過去三個月時間內,Dragonwell 收到了不少來自社區成員的反饋。那麼,本次正式發佈的 GA 版本加入了哪些新特性?對開發者而言意味着什麼?java
8.0.0-GA 的工做目的是爲了讓 Dragonwell 儘快可以在產品環境裏使用。在這個版本里咱們同步了 OpenJDK 上游社區 jdk8u212-b04 的最新更新,這也意味着咱們同步了上游最新的安全更新和補丁。linux
除了同步上游,Dragonwell8 還修復了一些在阿里巴巴的 Java 場景下發現的一些很是重要的 Bug,而且經受了阿里巴巴內部場景的檢驗。同時咱們也提供了一個默認的安全證書,這個證書咱們會隨時更新和維護。git
熟悉 Dragonwell 的小夥伴可能都知道,Dragonwell 和 OpenJDK 上游相比提供了一些專有的特性好比:JFR,JWarmUp 等。這些特性在阿里巴巴內部獲得了普遍應用,爲阿里巴巴的 Java 業務的穩定運行立下了汗馬功勞,也能夠說是 Dragonwell 的獨門武器。在 8.0.0-GA,咱們也針對 JFR 特性作了一些修復和兼容性上的改進。因此喜歡 Dragonwell 新特性的的社區小夥伴們能夠放心大膽的使用它們了。咱們堅信,這些新特性不只可以阿里巴巴帶來價值,同時也能給社區的Java生態帶來價值。github
8.0.0-GA 的發佈具體的內容你們能夠參考 github 的 release notes, 戳這裏安全
介紹完龍井 8.0.0-GA 的新變化,不少小夥伴已經躍躍欲試了。別忙,在使用以前咱們再多嘮兩句,做爲龍井的家人,寶寶該如何成長,咱們有着許多的想法,但龍井是社區的孩子,但咱們也很是但願社區的小夥伴們可以幫助它們變化成長。因此咱們就一塊兒談談龍井將來可能發生那些變化。bash
龍井的自從誕生開始,就吸引了社區的目光,尤爲是 Dragonwell JDK 的一些新特性,幫助用戶在面臨業務挑戰時有了更多選擇。在今年 ISCA2019 Runtimes in the Cloud Tutorial 中,咱們向社區和學術界彙報了 Dragonwell 在新特性上的工做進展,也獲得了你們的積極響應。社區的反饋也是咱們下一步工做的動力,但願小夥伴多給意見。這個 talk 的介紹在這裏 http://www.cs.utah.edu/cloudruntimes/schedule.html#xiaoming ppt 從這裏下載 http://www.cs.utah.edu/cloudruntimes/slides/xiaoming.pdf
有興趣的小夥伴能夠看下。網絡
Dragonwell 目前存在的幾個特性都是通過阿里巴巴龐大 Java 場景的檢驗,在穩定性上是很是可靠的。下面咱們就來具體談談這幾個特性。併發
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 發佈的階段來收集。相比以前「人爲數據」的方式,主要有這幾個優點:
這個功能在 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 全名是 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 了。Dragonwell 會源源不斷地把阿里巴巴內部的一些創新特性反饋到社區,ElasticHeap 就是繼 JFR,JWarmUp 以後,Dragonwell 帶着滿滿的誠意計劃開放的第三個新特性(進入下一個版本發佈),OpenJDK 社區也是沒有的哦。
你們知道,Java 做爲高級語言會帶有垃圾回收器,隨着程序的運行,Java 會把用戶配置的內存逐漸所有使用掉。即便這些 Java 進程後來變得比較空閒,不須要這麼多資源了,那這些被佔用掉的內存也不會歸還給操做系統,從資源利用的角度,這會帶來某種意義上的浪費。而 Dragonwell 的 ElasticHeap 就改變了這種狀況,這是一個基於 G1 GC 的動態堆彈性伸縮的功能,能夠有效節約 java 進程實際物理內存佔用。Openjdk8 僅支持在 Full GC 時按照必定規則歸還物理內存。而 Dragonwell 的 ElasticHeap 提供了更敏捷有效的歸還內存的方式,有以下幾個特色:
a. 根據內存分配速度和 GC 壓力自適應調整堆大小(自動歸還內存)
b. 根據 jcmd/MXBean 命令主動式限制堆的大小(可整堆限制或分代限制)
下圖是阿里巴巴電商應用在雙 11 時使用 ElasticHeap GC 壓力自適應堆調整的應用的監控圖
各位小夥伴們請期待吧,ElasticHeap 將在下個版本的發佈中揭開神祕面紗。
目前 Alibaba Dragonwell 只支持 Linux x86-64 平臺,開發者可經過以下步驟使用 Alibaba Dragonwell。
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
對於使用預編譯 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 生態力量而努力,讓中國開發者的聲音被全世界所傾聽。