java~graalVM虛擬機器

张占岭發表於2024-04-30

GraalVM

GraalVM 是一種高效能、通用的虛擬機器,由 Oracle 公司開發。它支援多種程式語言(如 Java、JavaScript、Python 等),並提供了即時編譯器、AOT 編譯器等功能。GraalVM 的主要特點包括:

  1. 高效能:GraalVM 提供了優秀的即時編譯器,能夠將程式在執行時快速編譯成原生代碼,從而提高執行效率。
  2. 多語言支援:除了支援 Java 之外,GraalVM 還支援其他多種程式語言,可以在同一個虛擬機器中執行不同語言的程式。
  3. AOT 編譯:GraalVM 支援提前(Ahead of Time)編譯,能夠將程式編譯成本地可執行檔案,減少啟動時間和記憶體佔用。
  4. 嵌入式引擎:GraalVM 提供了 JavaScript 引擎,可以作為嵌入式引擎使用,方便在 Java 應用中執行 JavaScript 程式碼。
  5. 生態系統: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 編譯的主要優點包括:

  1. 啟動效能最佳化:AOT 編譯可以將程式預先編譯成本地機器碼,減少了程式啟動時的編譯時間,加快了啟動速度。

  2. 記憶體佔用最佳化:AOT 編譯可以減少執行時的記憶體佔用,因為不需要在執行時再進行編譯,節省了記憶體空間。

  3. 安全性提高:AOT 編譯可以在編譯時進行更多的靜態分析和最佳化,提高了程式碼的安全性和穩定性。

然而,AOT 編譯也存在一些缺點,比如失去了 JIT 編譯的動態最佳化能力,可能導致一些無法被預測的效能問題;同時,AOT 編譯會增加構建和部署的複雜性,因為需要提前確定編譯目標平臺等因素。

總的來說,AOT 編譯適合於那些對啟動速度和記憶體佔用有較高要求的場景,比如移動應用、雲原生應用等領域。在 GraalVM 等技術中,AOT 編譯得到了廣泛的應用,並取得了顯著的效果。

springboot打包到graalVM映象

要將 Spring Boot 程式打包成 Docker 映象,並使用 GraalVM 作為基礎映象,可以按照以下步驟進行操作:

  1. 準備 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"]
  1. 構建 Spring Boot 可執行 JAR 檔案:確保你的 Spring Boot 專案已經編譯打包成可執行的 JAR 檔案。

  2. 構建 Docker 映象:在專案根目錄下執行以下命令來構建 Docker 映象:

docker build -t your-image-name .

其中,your-image-name 是你自定義的映象名稱。

  1. 執行 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

相關文章