天天看點

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

作者|江丹陽(Mario)

出品|阿裡巴巴新零售淘系技術部

導讀:AJDK11(阿裡内部基于openJDK11的定制版本)在19年3月左右釋出,到現在也快1年了,不過目前整體使用的面還是比較窄,特性被了解的也不是很多,Java11作為OpenJDK釋出的LTS版本,對我們來說,還是需要去擁抱和熟悉的,是以從目前的Java8更新到Java11,是一件不緊急但是重要的事情;

一說更新

▐ 運作環境更新

環境更新,主要是alios7(内部Linux 7u2的定制版) + ajdk11(目前比較穩定的版本是ajdk-11_0_4_5-b71),這個更新通過修改應用APP-META目錄中的dockerfile可以完成;

▐ 建構插件更新

建構插件的更新主要是maven compile插件的更新,需要更新到3.8.0版本,pandora-boot的maven插件更新到2.1.11.9,依賴如下:

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

同時将編譯的目标檔案和源檔案的編譯版本指定下:

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

▐ 架構更新

主要是springboot和pandoraboot的更新,同時還有pandora sar包的更新:

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

▐ 依賴更新:

在java11中移除了一些子產品,是以在做更新的時候,需要看需求手動進行依賴,主要有如下幾個:

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

▐ 運作腳本更新:

這裡的腳本更新主要是一些jvm的啟動參數相容問題,比如debug option,還有gc日志列印相關的option,主要修改appctl.sh和setenv.sh兩個腳本;

比如java9以前的GC日志列印是:

-Xloggc:${MIDDLEWARE_LOGS}/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"           

Java9以後就是:

-Xlog:gc*:${MIDDLEWARE_LOGS}/gc.log:time"           

release檔案更新:

主要是指定新的ajdk的版本,以及maven的版本(3.5.0及以上)

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語

二訴“債務”

之前有和一些更新過的同學溝通過,這個java11的更新還是比較平滑、順利,沒有太多成本,但是這次走起來其實還是克服了不少困難,不是本身java11更新的問題,而是曆史的債務在java11更新的過程中都暴露了出來;

▐ linux版本

linux 版本 7u2 出來已經5年多了,目前集團所有的線上和線下的主控端的系統都是alios7,是以很難想象現有的系統在docker裡面依賴的是5u7的linux基礎鏡像,這裡面會有一個比較嚴重的性能問題:

因為7u2的glibc去掉了vsyscall改成vdso,5u7的glibc還是保留vsyscall,就需要有一個核心接口來模拟,這個模拟是有嚴重性能問題的,sys%會非常高;

是以沒有更新的趕緊更新下吧,使用裁剪版本(alios7u2-min),體積可以從原來的5u7 2G多到500M多,這個大小的優化能提升的東西不做贅述;

▐ 本地啟動

本地啟動,好多開發同學可能都沒有用過,是以起不來也不是一件很難想象的事情,那問一個問題:為什麼做pandoraboot更新?為什麼做boot化?boot化帶來了哪些價值?給我們帶來了哪些改變?我覺得這些問題在最開始推微服務的時候,大家都是很關注的,但是當後面微服務成為趨勢,pandoraboot或springboot成為微服務架構之後,之前的問題就沒人關注了;

應用owner還是看看自己的boot化應用是否能啟動吧,本地啟動、本地調試可以節省的開發調試時間誰用誰知道吧;

▐ autoconfig

老生常談的問題,這個屬于時代産物了,在架構演進過程中一直被容忍,一直被小心呵護相容,因為動之成本有點高,協同比較大,說白了就是很難~~~

有理想追求的程式員大家可以聚一起看看怎麼落地~~

三叙“危機”

▐ “危”

面試的标準個人看來是越來越高,但是裡面的人做事的标準是越來越低,“調包俠”、“拿來主義”、“翻譯器”、“施工隊”現象也是越來越常見,我隻想說,我們是程式員,借用之前比較孤傲的定位,我們是“藝術家”,那什麼時候落魄成了我們當初斥責的模樣;從現在起,建立危機意識吧;

▐ “機”

事情是更新java11,獲益是java9到java11的所有的增強和新特性,下面是個人看到的一些利益點,歡迎大家補充;

記憶體優化

java9中增強了string的底層存儲,LATIN1編碼的字元串底層存儲從原來的char數組變成了byte資料,對于這樣指定的字元串的記憶體使用節省一半,整體記憶體的節省大概10%(不同應用可能差别比較大);

▐ HotSpot增強

java9中引入了HotSpotIntrinsicCandidate這個注釋,主要是在使用CPU及OS層面的native方法替換java function,達到性能提升,效果會因為平台和硬體不同有差異,目前主要是在一些基礎類的一些高頻方法中出現該注解;

▐ GC提升

我們目前使用的是CMS垃圾回收器,相當好,我們也用了很長一段時間了,不過CMS随着發展,也暴露出兩個問題,一個是面向大記憶體的回收效率會下降比較明顯,同時回收的時長不可控;在後續的Java9中的G1和Java11中ZGC相繼出現,就是針對上述兩個方向進行的優化;

更新了Java11,其實不一定要用ZGC,因為目前我們大部分應用的配置是4c8g,有人做過性能測試,在8G以下,CMS的回收性能會比ZGC還好一點,8G的情況下差不多,那麼8G以上,ZGC會的性能會比較好,同時他的回收效率受記憶體大小的持續上升影響較小;目前我們有些核心應用的配置是8c16G的,是以這塊GC的增強還是有收益的;

FaaS化

FaaS最近一段時間都是一個蠻熱的話題,不過距離整體在現有業務場景中廣泛應用,還有一段時間;那更新java11和faas化有什麼關聯呢?

個人感覺是兩個方面:1.子產品化,2.graalVM;

FaaS要支援線上業務的核心關鍵在于Function的快速分發、運作環境快速拉起來達到低延遲回報,是以子產品化可以讓應用足夠小,graalVM可以提前将非動态java代碼編譯成native image,提升啟動速度同時減少整體app的大小;

趨勢

從java11開始,openJDK major version的釋出間隔差不多是半年,不用全部都要去關注,都是追趕,但是LTS版本,需要去追趕,去更新,Java11就是最新的LTS版本,下一個或者再一下major version,很可能又是一個LTS版本;雖然目前使用Java8都挺好的,現實是Java8的一些特性會被往後移植,但是後續版本的特性和優化不會再被內建到Java8中了,勢不可逆,跟不上就快要被淘汰了;

結語

java11的更新帶來的收益還是可圈可點的,整體過程也還順滑,沒有相容性問題,感興趣的同學可以嘗試更新,并且關注一些名額變化。

We are hiring

淘系技術部依托淘系豐富的業務形态和海量的使用者,我們持續以技術驅動産品和商業創新,不斷探索和衍生颠覆型網際網路新技術,以更加智能、友好、普惠的科技深度重塑産業和使用者體驗,打造新商業。我們不斷吸引使用者增長、機器學習、視覺算法、音視訊通信、數字媒體、移動技術、端側智能等領域全球頂尖專業人才加入,讓科技引領面向未來的商業創新和進步。

請投遞履歷至郵箱:[email protected]

更多技術幹貨,關注「淘系技術」微信公衆号。

Java11更新:“債務”“危機”一說更新二訴“債務”三叙“危機”記憶體優化FaaS化趨勢結語