FaaS - 無服務器計算,亦即函數即服務,英文 Fuction as a Service,其目標是但願應用不用一直運行着,只有當有請求來的時候,才快速啓動這個應用,而後請求一走就停掉這個應用。換句話說,不讓應用在背景程式持續的啓動着,而是有須要的時候纔開啓。java
這就要求應用要有快速啓動,快速中止的能力。git
相對龐大的 Jvm 啓動時間,加上巨型的 Spring Framework, 不少應用啓動動輒分鐘級,實現 FaaS 實在是癡心妄想。相比之下,PHP還真是最好的語言,由於 PHP的啓動模型本質上就是 FaaS, 你哪哈... 別說了。github
話說 Spring 當年就是爲了簡化 J2EE 的龐雜而出生的,現在也變成了本身討厭的樣子...服務器
軟件的問題由軟件來解決, Any problem in computer science can be solved with another layer of indirection. 沒有什麼問題是口罩和護墊解決不了的,若是是,就再加一層。框架
GraalVM 就是新出現的那一層。函數
從上面看,這一層增長了對多語言的支持,Truffle Framework 支持Ruby, R, Js編譯到JVM,再嫁接一下LLVM,那傳統的C/C++等也能夠通通編譯了。話說 C/C++原本就是直接編譯成原生的,這回 C -> LLVM -> GrallVM -> 原生, 你品,你細品,究竟折騰個啥。ui
因此說加層惟一解決不了的問題是層過多的問題:...except for the problem of too many layers of indirection - Kevlin Henney.spa
從下面看,GraalVM 能夠將 .class 編譯成原生代碼,去掉了包中不使用的代碼,大大提升了啓動速度,運行速度據稱也大大提升。code
人生老是不要臉的輪迴。當年微軟用Visual J++把 Java 編成原生,速度超快,引來的是與Sun的官司戰。Sun被Oracle收購,Oracle搞來搞去又走上了這條螺旋降低的道路。blog
這樣,替換VM直接代來了效率提高,帶來了和加內存升級CPU同樣的效果。
更多原理上的內容能夠參考這篇, 寫得很詳細。只是少分部內容有點過期了。
https://www.graalvm.org/downl...
完整地用類用例能夠看看這裏,有不少:
git clone https://github.com/quarkusio/quarkus-quickstarts.git
Quarkus 框架結合 GraalVM 的各種應用。
下面咱們只看幾個最簡單的 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
編譯一個helloworld爲原生代碼須要 24 秒, 同時也須要大量的物理內存,最後一列是內存的使用。
運行,原生:
$ time ./helloworld Hello, World! real 0m0.010s user 0m0.004s sys 0m0.003s
比較傳統方式:
$ time ./helloworld Hello, World! real 0m0.010s user 0m0.004s sys 0m0.003s
這個原生的 helloworld 個頭也是驚人的:
$ 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.