天天看點

助力國産晶片 —Dragonwell新增aarch64支援

助力國産晶片 —Dragonwell新增aarch64支援

前言

目前國産化晶片無疑是中國科技圈的一大熱點。得益于相對較高的自由度,以及比較完善的生态環境,ARM架構得到了衆多國内晶片公司的認可。然而由于OpenJDK社群對ARM架構的支援較晚,一些國内廣泛使用的JDK版本(比如JDK8)的社群代碼主幹上并沒有對aarch64的支援;另外一些廠商雖然提供了支援aarch64的JDK,卻并沒有開源代碼。這對嘗試新架構的Java使用者在選擇JDK時造成了一些困擾。

為了解決這個問題,Alibaba Dragonwell近日釋出了新版本(8.5.5及11.0.9.4),添加了對aarch64架構的支援,對自主晶片的規模化使用,技術架構演進給予了強力支撐。

Alibaba Dragonwell

Alibaba Dragonwell是阿裡巴巴開源的JDK,它是OpenJDK的下遊,提供了OpenJDK的所有能力,并且通過AdopeOpenJDK社群進行建構釋出,提供高品質的經過測試驗證的JDK發行版。

下圖展示Alibaba Dragonwell的整體架構:

助力國産晶片 —Dragonwell新增aarch64支援

除了OpenJDK已有功能外,Alibaba Dragonwell還增加了以下獨有特性

  • JWarmup: 根據前一次程式運作的情況,記錄下熱點方法、類編譯順序等資訊,在應用下一次啟動的時候積極加載相關的類,并積極編譯相關的方法,進而應用啟動後可以直接運作編譯好的Java代碼。
  • JFR: Java Flight Recorder (JFR) 是一款用于收集Java應用運作過程中的診斷及性能資料的工具,目前已經被內建進Alibaba Dragonwell中。在使用預設配置的情況下,JFR帶來的額外開銷将小于2%,是以可以用在生産環境。
  • G1ElasticHeap: 支援在G1中動态歸還堆實體記憶體并降低Java程序的記憶體占用。
  • Wisp: Wisp在JVM上提供了一種使用者态的線程實作。開啟Wisp2後,Java線程不再簡單地映射到核心級線程,而是對應到一個協程,JVM在少量核心線上排程大量協程執行,以減少核心的排程開銷,提升web伺服器的性能。

aarch64支援

在介紹Alibaba Dragonwell的aarch64支援之前,我們現在回顧下上遊OpenJDK的情況。

JDK9引入了一個新JEP(Java Enhancement Proposal): JEP237 正式引入了對arm32及aarch64的支援。自此我們可以視JDK9為一個分水嶺,在JDK9及之後的JDK,包括長期支援版本JDK11,在代碼主幹上具備對aarch64的支援,而之前的版本(例如JDK8)并不相容aarch64。

從上遊情況可知,對于Dragonwell8來說,aarch64是一個從0到1的過程,是以主要以穩定性為主,修複了JIT代碼,編譯線程以及鎖操作中的一些bug,在阿裡的多個應用中表現穩定,且通過了TCK測試。

對于Dragonwell11來說,目标是在OpenJDK11現有的基礎上進行充分的優化,追求極緻性能。具體的,Dragonwell11在以下方面進行了優化

  1. 優化了GC work stealing機制,使GC線程負載更加均衡,減少GC時間
  2. 使用高版本GCC編譯JDK,并使用ARMv8.2的指令進行優化,hostpot JVM的性能獲得了增強,特别是原子CAS(Compare and Swap)操作有明顯提升。

    下圖是優化前後在不同核數下運作SPECjbb2015的吞吐率對比,吞吐率計算方法如下,越高越好。

    吞吐率 = (運作時間 – Stop-The-World時間)/運作時間 * 100%

助力國産晶片 —Dragonwell新增aarch64支援

我們可以看到随着核數增長未優化的版本吞吐率明顯下降,這是因為GC使用的CAS很多,而傳統的CAS實作方式在多核情況下性能較差,導緻GC暫停時間顯著增加。優化後的版本随着核數增長,吞吐率始終保持在較高的水準,可拓展性很好。

小結

本文總結了Dragonwell支援aarch64架構的一些相關情況及優化措施,歡迎大家下載下傳使用Alibaba Dragonwell。

Alibaba Dragonwell 8 Wiki

https://github.com/alibaba/dragonwell8/wiki

Alibaba Dragonwell11 Wiki

https://github.com/alibaba/dragonwell11/wiki