java 缘起_GraalVM 助力 Java 进入函数即服务时代
緣起
FaaS - 無(wú)服務(wù)器計(jì)算,亦即函數(shù)即服務(wù),英文 Fuction as a Service,其目標(biāo)是希望應(yīng)用不用一直運(yùn)行著,只有當(dāng)有請(qǐng)求來(lái)的時(shí)候,才快速啟動(dòng)這個(gè)應(yīng)用,然后請(qǐng)求一走就停掉這個(gè)應(yīng)用。換句話說(shuō),不讓?xiě)?yīng)用在背景程式持續(xù)的啟動(dòng)著,而是有需要的時(shí)候才開(kāi)啟。
這就要求應(yīng)用要有快速啟動(dòng),快速停止的能力。
相對(duì)龐大的 Jvm 啟動(dòng)時(shí)間,加上巨型的 Spring Framework, 很多應(yīng)用啟動(dòng)動(dòng)輒分鐘級(jí),實(shí)現(xiàn) FaaS 實(shí)在是癡心妄想。相比之下,PHP還真是最好的語(yǔ)言,因?yàn)?PHP的啟動(dòng)模型本質(zhì)上就是 FaaS, 你哪哈... 別說(shuō)了。
話說(shuō) Spring 當(dāng)年就是為了簡(jiǎn)化 J2EE 的龐雜而出生的,如今也變成了自己討厭的樣子...
軟件的問(wèn)題由軟件來(lái)解決, Any problem in computer science can be solved with another layer of indirection. 沒(méi)有什么問(wèn)題是口罩和護(hù)墊解決不了的,如果是,就再加一層。
GraalVM 就是新出現(xiàn)的那一層。
從上面看,這一層增加了對(duì)多語(yǔ)言的支持,Truffle Framework 支持Ruby, R, Js編譯到JVM,再嫁接一下LLVM,那傳統(tǒng)的C/C++等也可以統(tǒng)統(tǒng)編譯了。話說(shuō) C/C++本來(lái)就是直接編譯成原生的,這回 C -> LLVM -> GrallVM -> 原生, 你品,你細(xì)品,究竟折騰個(gè)啥。
所以說(shuō)加層唯一解決不了的問(wèn)題是層過(guò)多的問(wèn)題:...except for the problem of too many layers of indirection - Kevlin Henney.
從下面看,GraalVM 可以將 .class 編譯成原生代碼,去掉了包中不使用的代碼,大大提高了啟動(dòng)速度,運(yùn)行速度據(jù)稱也大大提高。
人生總是不要臉的輪回。當(dāng)年微軟用Visual J++把 Java 編成原生,速度超快,引來(lái)的是與Sun的官司戰(zhàn)。Sun被Oracle收購(gòu),Oracle搞來(lái)搞去又走上了這條螺旋下降的道路。
這樣,替換VM直接代來(lái)了效率提升,帶來(lái)了和加內(nèi)存升級(jí)CPU一樣的效果。
更多原理上的內(nèi)容可以參考這篇, 寫(xiě)得很詳細(xì)。只是少分部?jī)?nèi)容有點(diǎn)過(guò)時(shí)了。
實(shí)操
下載GraalVM
完整地用類(lèi)用例可以看看這里,有很多:git clone https://github.com/quarkusio/quarkus-quickstarts.git
Quarkus 框架結(jié)合 GraalVM 的各類(lèi)應(yīng)用。
下面我們只看幾個(gè)最簡(jiǎn)單的 GraalVM 用例.// HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}$ native-image HelloWorld
[helloworld:29104] classlist: 878.53 ms, 0.96 GB
[helloworld:29104] (cap): 5,001.41 ms, 0.96 GB
[helloworld:29104] setup: 7,970.43 ms, 0.96 GB
[helloworld:29104] (clinit): 136.83 ms, 1.20 GB
[helloworld:29104] (typeflow): 3,437.24 ms, 1.20 GB
[helloworld:29104] (objects): 3,531.34 ms, 1.20 GB
[helloworld:29104] (features): 194.35 ms, 1.20 GB
[helloworld:29104] analysis: 7,426.70 ms, 1.20 GB
[helloworld:29104] universe: 243.17 ms, 1.20 GB
[helloworld:29104] (parse): 732.66 ms, 1.67 GB
[helloworld:29104] (inline): 1,048.13 ms, 1.67 GB
[helloworld:29104] (compile): 4,809.83 ms, 2.29 GB
[helloworld:29104] compile: 7,051.94 ms, 2.29 GB
[helloworld:29104] image: 986.33 ms, 2.29 GB
[helloworld:29104] write: 252.78 ms, 2.29 GB
[helloworld:29104] [total]: 24,931.40 ms, 2.29 GB
編譯一個(gè)helloworld為原生代碼需要 24 秒, 同時(shí)也需要大量的物理內(nèi)存,最后一列是內(nèi)存的使用。
運(yùn)行,原生:$ time ./helloworld
Hello, World!
real 0m0.010s
user 0m0.004s
sys 0m0.003s
比較傳統(tǒng)方式:$ time ./helloworld
Hello, World!
real 0m0.010s
user 0m0.004s
sys 0m0.003s
這個(gè)原生的 helloworld 個(gè)頭也是驚人的:$ ll
total 15712
-rw-r--r-- 1 427 12 8 00:18 HelloWorld.class
-rw-r--r-- 1 116 12 8 00:18 HelloWorld.java
-rwxr-xr-x 1 8032816 12 8 00:19 helloworld
足足 8 Mb.
總結(jié)
以上是生活随笔為你收集整理的java 缘起_GraalVM 助力 Java 进入函数即服务时代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java怎么使用spring定时器_浅析
- 下一篇: java海滩上有一,Java猴子分桃问题