GraalVM(雲原生時代的Java)和IoT在邊緣側落地與實踐

2023-04-25 12:03:23

環顧四周,皆是對手!

  • 雲時代的掉隊者,由於Java啟動的高延時、對資源的高佔用、導致在Serverless及FaaS架構下力不從心,在越來越流行的邊緣計算、IoT方向上也是難覓蹤影;
  • Java語言在業務服務開發中孤獨求敗,但在系統級應用領域幾乎是C、C++、攪局者Go、黑天鵝Rust的天下;
  • 移動應用、敏捷應用的追隨者,移動應用中Android逐步去Java,前端又是JS的世界,敏捷開發方面前有Ruby、Python後有NodeJS;

此時眾多的Javaer會不經意發問:學Java還有未來麼?

你可以嫌棄Java, 但是可以永遠相信JVM! 在雲原生如日中天、Serverless日漸成熟、新語言百花齊放的當下,跨語言、Native支援、高效能低資源佔用的技術必定是其璀璨的明珠,而GraalVM正是這樣一個承載了JVM未來,將Java帶入下一波技術的弄潮兒。

GraalVM - 雲原生時代的Java

「一次編寫,到處執行「是Java語言的特性,這一重要特性依靠的是JVM虛擬機器器

在討論GraalVM之前,我們先聊下Java程式碼是怎麼執行的?

從硬體視角來看,Java位元組碼無法直接執行。因此,Java虛擬機器器需要將位元組碼翻譯成機器碼。

從虛擬機器器視角來看,執行Java程式碼首先需要將它編譯而成的 class 檔案載入到 Java 虛擬機器器中。載入後的 Java 類會被存放於方法區(Method Area)中。實際執行時,虛擬機器器會執行方法區內的程式碼。Java 虛擬機器器同樣也在記憶體中劃分出堆和棧來儲存執行時資料。

不同的是,Java 虛擬機器器會將棧細分為面向 Java 方法的 Java 方法棧,面向本地方法(用 C++ 寫的 native 方法)的本地方法棧,以及存放各個執行緒執行位置的 PC 暫存器。

在執行過程中,每當呼叫進入一個 Java 方法,Java 虛擬機器器會在當前執行緒的 Java 方法棧中生成一個棧幀,用以存放區域性變數以及位元組碼的運算元。這個棧幀的大小是提前計算好的,而且 Java 虛擬機器器不要求棧幀在記憶體空間裡連續分佈。

當退出當前執行的方法時,不管是正常返回還是異常返回,Java 虛擬機器器均會彈出當前執行緒的當前棧幀,並將之捨棄。

GraalVM帶來哪些神奇的黑魔法