新聞中心
GraalVM下一代JVM到底是什么?
作者: 咖啡拿鐵 2021-06-07 08:32:47
云計(jì)算
虛擬化 再說(shuō)GraalVM之前,我們先來(lái)聊聊JVM,JVM也就是我們的java虛擬機(jī),如果我們想要運(yùn)行Java程序,那就需要在JVM上進(jìn)行運(yùn)行,通過(guò)Jvm將我們的代碼翻譯成機(jī)器能理解的代碼,然后執(zhí)行。那么我們JVM是只能運(yùn)行java的嘛,當(dāng)然不是,我們還有很多比較出名的語(yǔ)言比如,Scala,Groovy都是通過(guò)各自的編譯器編譯成java虛擬機(jī)對(duì)應(yīng)的字節(jié)碼,然后來(lái)進(jìn)行執(zhí)行。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)永善,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
本文轉(zhuǎn)載自微信公眾號(hào)「咖啡拿鐵」,作者咖啡拿鐵。轉(zhuǎn)載本文請(qǐng)聯(lián)系咖啡拿鐵公眾號(hào)。
背景
上周有幸去QCON聽了一下各個(gè)公司大佬的技術(shù)分享,但是至于收獲嘛,知識(shí)沒(méi)帶走多少,帶走了不少展臺(tái)送的小禮品,哈哈~。圖片
其實(shí)挺這種大會(huì)想要真正的了解細(xì)節(jié)還是難,主要還是了解行業(yè)新趨勢(shì),技術(shù)新動(dòng)態(tài),其中阿里有個(gè)冷啟動(dòng)加載技術(shù)的分享,提到了一個(gè)技術(shù)叫GraalVM,這個(gè)單詞之前或多或少不經(jīng)意間看見過(guò),但是一直沒(méi)有了解過(guò),正好這位阿里的大佬再次提及這次技術(shù),沒(méi)想到這個(gè)技術(shù)如此強(qiáng)大,于是下來(lái)便細(xì)細(xì)的查閱了一些資料,想和大家分享一下。
GraalVM是什么?
再說(shuō)GraalVM之前,我們先來(lái)聊聊JVM,JVM也就是我們的java虛擬機(jī),如果我們想要運(yùn)行Java程序,那就需要在JVM上進(jìn)行運(yùn)行,通過(guò)Jvm將我們的代碼翻譯成機(jī)器能理解的代碼,然后執(zhí)行。那么我們JVM是只能運(yùn)行java的嘛,當(dāng)然不是,我們還有很多比較出名的語(yǔ)言比如,Scala,Groovy都是通過(guò)各自的編譯器編譯成java虛擬機(jī)對(duì)應(yīng)的字節(jié)碼,然后來(lái)進(jìn)行執(zhí)行。
再來(lái)回到GraalVM,乍一看好像是Graal這個(gè)語(yǔ)言的虛擬機(jī),其實(shí)不是的,GraalVM是ORACLE開發(fā)的一款“通用”虛擬機(jī),怎么理解這個(gè)通用呢?上面我們說(shuō)到JVM可以支持除了Java以外的語(yǔ)言,那么GraalVM他是可以支持JavaScript,Python,Ruby,C和C ++以及JVM語(yǔ)言等等(理論上來(lái)說(shuō)只要做對(duì)應(yīng)語(yǔ)言的開發(fā),所有語(yǔ)言都可以支持)。
但是這里要值得注意的是GraalVM是用java寫的,所以作為一個(gè)JAVA程序員如果想修改虛擬機(jī)的代碼,是不需要理解C++或者C等語(yǔ)言的。
GraalVM作用是什么?
啟動(dòng)加速
在QCon上還有一些技術(shù)聽得比較多,那就是k8s,serverless等等,我們知道彈性擴(kuò)展是其中的核心,比如當(dāng)我們的集群出現(xiàn)突發(fā)流量的時(shí)候,一般這個(gè)時(shí)候會(huì)快速擴(kuò)容機(jī)器,但是由于我們的Java的特性,帶來(lái)兩個(gè)方面的慢:
- 啟動(dòng)慢:當(dāng)我們啟動(dòng)JAVA的時(shí)候,也就是將我們的class文件加載到j(luò)vm中,這個(gè)加載class可是一筆不小開銷,需要檢索,驗(yàn)證,解析等等。
- 啟動(dòng)后開始運(yùn)行慢:我們知道java代碼在啟動(dòng)后的一段時(shí)間之內(nèi)是解釋執(zhí)行的,如果想要達(dá)到編譯執(zhí)行,是需要借助我們的JIT技術(shù),將其直接編譯成機(jī)器碼執(zhí)行,從而達(dá)到高效執(zhí)行,這個(gè)也就是我們所說(shuō)的預(yù)熱。
從QCon上截取了一張圖,也就是我們java編譯技術(shù)演進(jìn)。
前面兩個(gè)階段也就是大家平常比較熟悉的階段,通過(guò)翻譯和c1編譯和c2編譯來(lái)進(jìn)行代碼執(zhí)行,而第三部分出現(xiàn)了一個(gè)AOT技術(shù),也就是靜態(tài)編譯,可以在執(zhí)行代碼之前就將我們的代碼編譯成機(jī)器碼,和C++一樣,但是由于JAVA有很多動(dòng)態(tài)特性,一般我們利用jaotc來(lái)對(duì)jdk自帶的包進(jìn)行靜態(tài)編譯,然后其他的包依然采用翻譯和jit執(zhí)行。
所以就迎來(lái)了第四階段SubstrateVM(后面簡(jiǎn)稱SVM),這個(gè)是基于Graal的AOT框架,他可以將我們的動(dòng)態(tài)特性也可以進(jìn)行靜態(tài)編譯,可以想一下Java里面最動(dòng)態(tài)的其實(shí)就是反射,比如你要執(zhí)行某個(gè)類的方法,你可能會(huì)這么寫:
- String method = "xx";
- object.invoke(method);
可以發(fā)現(xiàn)我們的方法其實(shí)是一個(gè)字符串并且還是一個(gè)動(dòng)態(tài)的變量,那這種這么動(dòng)態(tài)的東西如何做到靜態(tài)編譯了,阿里內(nèi)部是通過(guò)觀察,比如這個(gè)程序上去跑個(gè)幾周,獲取invoke的所有場(chǎng)景,然后一起進(jìn)行編譯,當(dāng)時(shí)也提問(wèn)到如果這個(gè)有沒(méi)有觀察的怎么辦呢,那么這個(gè)的確就會(huì)報(bào)錯(cuò),所以這一塊的使用的確是個(gè)問(wèn)題。
通過(guò)靜態(tài)編譯完成之后,我們的性能有得到提升嗎?
從上面的性能數(shù)據(jù)來(lái)看,我們的性能和Go是相當(dāng)?shù)?,?nèi)存只有Go的一半,怪不得他們都在說(shuō)Graal就是用來(lái)替代go的。
同時(shí)Graal編譯器也可以替代C2編譯器,在twitter和facebook內(nèi)部生產(chǎn)環(huán)境已經(jīng)使用Graal進(jìn)行替換C2。
所以對(duì)彈性伸縮,啟動(dòng)速度要求比較高的程序,可以考慮將GraalVM作為自己的虛擬機(jī)選擇。
多語(yǔ)言調(diào)用
上面說(shuō)過(guò)我們GraalVM支持很多語(yǔ)言,設(shè)想一下我們有個(gè)這樣的需求,java做服務(wù)器的開發(fā),python或者R語(yǔ)言去做數(shù)據(jù)分析,以前我們可能需要調(diào)用Rpc去做這樣的事,現(xiàn)在我們可以將他們放在同一個(gè)項(xiàng)目或者同一個(gè)文件當(dāng)中,利用GraalVM的特性就可以做到這樣的事
總結(jié)
GraalVM的確是一個(gè)比較新的技術(shù),他的整個(gè)野心也看得出來(lái)是非常大的,畢竟想做的是一個(gè)通用的虛擬機(jī),如果他做起來(lái)的話,對(duì)Java程序員是比較好的,因?yàn)檫@個(gè)是用Java進(jìn)行開發(fā)的,大家其實(shí)有興趣可以下來(lái)在搜索一些資料再了解一下。
文章標(biāo)題:GraalVM下一代JVM到底是什么?
網(wǎng)站路徑:http://m.5511xx.com/article/cogsjph.html


咨詢
建站咨詢
