GraalVM
GraalVM 是一種高效能、通用的虛擬機器,由 Oracle 公司開發。它支援多種程式語言(如 Java、JavaScript、Python 等),並提供了即時編譯器、AOT 編譯器等功能。GraalVM 的主要特點包括:
- 高效能:GraalVM 提供了優秀的即時編譯器,能夠將程式在執行時快速編譯成原生代碼,從而提高執行效率。
- 多語言支援:除了支援 Java 之外,GraalVM 還支援其他多種程式語言,可以在同一個虛擬機器中執行不同語言的程式。
- AOT 編譯:GraalVM 支援提前(Ahead of Time)編譯,能夠將程式編譯成本地可執行檔案,減少啟動時間和記憶體佔用。
- 嵌入式引擎:GraalVM 提供了 JavaScript 引擎,可以作為嵌入式引擎使用,方便在 Java 應用中執行 JavaScript 程式碼。
- 生態系統:GraalVM 生態系統豐富,支援各種工具和框架,如 GraalVM Native Image、Truffle 框架等。
總的來說,GraalVM 是一款功能強大、靈活多樣的虛擬機器,適合用於構建高效能、多語言混合的應用程式,並且在雲端計算、大資料等領域有著廣泛的應用前景。
GraalVM 和 JVM 的關係
既然叫做VM,那肯定和 JVM 有關係的吧。JVM 全稱 Java 虛擬機器,我們都知道,Java 程式是執行在虛擬機器上的,虛擬機器提供 Java 執行時,支援解釋執行和部分的(JIT)即時編譯器,並且負責分配和管理 Java 執行所需的記憶體,我們所說的各種垃圾收集器都工作在 JVM 中。
比如 Oracle JDK、OpenJDK ,預設的 JVM 是 HotSpot 虛擬機器,這是當前應用最廣泛的一個虛擬機器。我們平時見到的各種將虛擬機器的書籍、文章、面試題,基本上都是說的 HotSpot 虛擬機器。
除此之外,還有一些商用,或者說小眾的虛擬機器存在,比如IBM 的J9 JVM,商用的 Zing VM 等。
GraalVM 可以完全取代上面提到的那幾種虛擬機器,比如 HotSpot。把你之前執行在 HotSpot 上的程式碼直接平移到 GraalVM 上,不用做任何的改變,甚至都感知不到,專案可以完美的執行。
但是 GraalVM 還有更廣泛的用途,不僅支援 Java 語言,還支援其他語言。這些其他語言不僅包括嫡系的 JVM 系語言,例如 Kotlin、Scala,還包括例如 JavaScript、Nodejs、Ruby、Python 等。
GraalVM 和JDK有什麼關係
- Java 虛擬機器都是內建在 JDK 中的,比如Orcale JDK、OpenJDK,預設內建的都是 HotSpot 虛擬機器,這是當前應用最廣泛的一個虛擬機器。
- GraalVM 也是一種 JDK,一種高效能的 JDK。完全可以用它替代 OpenJDK、Orcale JDK。
- GraalVM 可以完全取代上面提到的那幾種虛擬機器,比如 HotSpot。把你之前執行在 HotSpot 上的程式碼直接平移到 GraalVM 上,不用做任何的改變,甚至都感知不到,專案可以完美的執行。
- GraalVM 還有更廣泛的用途,不僅支援 Java 語言,還支援其他語言。這些其他語言不僅包括嫡系的 JVM 系語言,例如 Kotlin、Scala,還包括例如 JavaScript、Nodejs、Ruby、Python 等。
AOT編譯
AOT(Ahead of Time)編譯是一種在程式執行之前將程式碼編譯成本地機器碼的編譯方式。與傳統的 JIT(Just-In-Time)編譯相對應,AOT 編譯在程式執行之前就完成了編譯過程,生成可執行檔案,從而避免了執行時的即時編譯開銷。
AOT 編譯的主要優點包括:
-
啟動效能最佳化:AOT 編譯可以將程式預先編譯成本地機器碼,減少了程式啟動時的編譯時間,加快了啟動速度。
-
記憶體佔用最佳化:AOT 編譯可以減少執行時的記憶體佔用,因為不需要在執行時再進行編譯,節省了記憶體空間。
-
安全性提高:AOT 編譯可以在編譯時進行更多的靜態分析和最佳化,提高了程式碼的安全性和穩定性。
然而,AOT 編譯也存在一些缺點,比如失去了 JIT 編譯的動態最佳化能力,可能導致一些無法被預測的效能問題;同時,AOT 編譯會增加構建和部署的複雜性,因為需要提前確定編譯目標平臺等因素。
總的來說,AOT 編譯適合於那些對啟動速度和記憶體佔用有較高要求的場景,比如移動應用、雲原生應用等領域。在 GraalVM 等技術中,AOT 編譯得到了廣泛的應用,並取得了顯著的效果。
springboot打包到graalVM映象
要將 Spring Boot 程式打包成 Docker 映象,並使用 GraalVM 作為基礎映象,可以按照以下步驟進行操作:
- 準備 Dockerfile:在專案根目錄下建立一個名為
Dockerfile
的檔案,內容如下所示:
# 使用 GraalVM 作為基礎映象
FROM oracle/graalvm-ce:latest
# 設定工作目錄
WORKDIR /app
# 複製編譯好的 Spring Boot 可執行檔案到映象中
COPY target/<your-spring-boot-jar>.jar app.jar
# 執行 Spring Boot 應用
CMD ["java", "-jar", "app.jar"]
-
構建 Spring Boot 可執行 JAR 檔案:確保你的 Spring Boot 專案已經編譯打包成可執行的 JAR 檔案。
-
構建 Docker 映象:在專案根目錄下執行以下命令來構建 Docker 映象:
docker build -t your-image-name .
其中,your-image-name
是你自定義的映象名稱。
- 執行 Docker 容器:執行剛剛構建的 Docker 映象:
docker run -p 8080:8080 your-image-name
這樣就可以將 Spring Boot 程式打包成使用 GraalVM 作為基礎映象的 Docker 映象,併成功執行在 Docker 容器中了。需要注意的是,GraalVM 提供了適用於 Docker 的基礎映象,可以方便地整合到 Docker 構建流程中。
參考:https://www.cnblogs.com/fengzheng/p/16986535.html