java~graalVM虛擬機

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章