為何選擇 GraalVM?
GraalVM 會將您的 Java 應用程式預先編譯為獨立二進位檔,這些檔案可以立即啟動,在沒有預熱的情況下提供最佳效能,並使用更少的資源。
GraalVM 的主要優點是
- 低資源使用量:經 GraalVM 預先編譯的 Java 應用程式需要較少的記憶體和 CPU 才能執行。不會將記憶體或 CPU 週期花費在即時編譯上。因此,您的應用程式需要較少的資源才能執行,而且大規模運作的成本較低。
- 快速啟動:使用 GraalVM,您可以藉由在建置時初始化某些元素,而不是在執行時初始化,來更快地啟動 Java 應用程式,並且在沒有預熱的情況下立即達到可預測的最佳效能。
- 精簡的封裝:經 GraalVM 預先編譯的 Java 應用程式體積小,可以輕鬆封裝到輕量的容器映像檔中,以實現快速有效的部署。
- 更高的安全性:GraalVM 會將以下項目排除在二進位檔之外,從而減少 Java 應用程式的攻擊面:無法存取的程式碼(未使用的類別、方法和欄位)、即時編譯基礎架構和建置時初始化的程式碼。GraalVM 的封閉世界假設會阻止您的應用程式載入未知的程式碼,方法是在執行時停用反射、序列化等動態功能,並要求在建置時明確包含此類類別、方法和欄位的清單。GraalVM 可以在二進位檔中嵌入軟體物料清單 (SBOM),讓您更容易使用常見的安全掃描器來檢查您的 Java 應用程式二進位檔中已發布的 CVE(常見漏洞與暴露)。
- 輕鬆建置雲端原生微服務:Spring Boot、Micronaut、Helidon 和 Quarkus 等熱門微服務框架,以及 Oracle Cloud Infrastructure (OCI)、Amazon Web Services (AWS)、Google Cloud Platform (GCP) 和 Microsoft Azure 等雲端平台都支援 GraalVM。這讓您可以輕鬆建置雲端原生的 Java 微服務,編譯為二進位檔,封裝在小型容器中,並在雲端平台(OCI、AWS、GCP 和 Azure)上執行。
- 使用 Python 和其他語言擴展您的 Java 應用程式:使用 GraalVM,您可以嵌入 Python、JavaScript 等語言來擴展您的 Java 應用程式。
- 使用現有的開發和監控工具:您現有的 Java 應用程式開發和監控工具可與 GraalVM 應用程式二進位檔搭配使用。GraalVM 為 Maven 和 Gradle 提供建置外掛程式,並為 CI/CD 提供 GitHub Actions。GraalVM 支援 Java Flight Recorder (JFR)、Java Management Extensions (JMX)、記憶體傾印、VisualVM 和其他監控工具。GraalVM 可與現有的 Java 編輯器/IDE 和 JUnit 等單元測試框架搭配使用。
在 GraalVM JDK 上更快執行 Java
GraalVM 是一個完整的 JDK 發行版,可以使用新的進階即時編譯器 (Graal) 使 Java 應用程式執行得更快。作為一個平台,它使用 Java HotSpot VM,因此所有在 OpenJDK 上運作的工具和程式庫,都以相同的方式在 GraalVM JDK 上運作。在此情況下,GraalVM 將 JVM 中最後一層的優化編譯器 (C2) 替換為 Graal 編譯器。此編譯器是 Oracle Labs 10 多年研究的成果,其中包含數個新的最佳化功能,例如進階內嵌、部分逸出分析、程式碼重複和投機最佳化。GraalVM 本身是以 Java 而非 C/C++ 撰寫,這簡化了維護,並幫助我們更快地開發和交付新的最佳化。
Oracle Cloud、Twitter 和 Facebook 等多家公司正在 GraalVM JDK 上執行大型 Java 應用程式,以提高效能、減少資源使用量並降低部署成本。GraalVM JDK 可以簡單地用作其他 JDK 的直接替代品 — 請參閱如何開始使用。
建置 Java 應用程式的原生執行檔
在 JVM 上執行應用程式可能會產生啟動和佔用空間的成本。GraalVM 包括 Native Image:這是一種利用 Graal 編譯器來產生 Java 應用程式的原生執行檔的技術,這些執行檔是獨立的,因此不再需要 JVM。影像產生程序會使用靜態分析來找出所有可從主 Java 方法存取的程式碼,然後執行完整的預先編譯 (AOT)。在建置時,它還會執行快照,因此,在執行時,應用程式會以預先填入的堆積更快地啟動。產生的原生二進位檔包含機器碼形式的整個程式,該程式在啟動時即可立即執行。此類原生執行檔具有以下功能
- 由於在建置時預先初始化 JDK 和使用者程式碼,因此可立即啟動
- 由於程式碼執行額外負荷最小化,因此可減少記憶體和 CPU 使用量
- 由於 AOT 方法和精簡的執行時間元件,因此封裝體積小
- 由於程式碼消除和 AOT 方法,因此減少攻擊面
嘗試使用 Native Image,方法是建置您的第一個應用程式。
使用最新的產業工具和平台
Native Image 是微服務和無伺服器 Java 應用程式的絕佳部署模型。這就是 Spring Boot、Micronaut、Quarkus 和 Helidon 等多個主要應用程式框架提供 Native Image 支援的原因。有一個完整的程式庫、框架和工具生態系統,您可以直接使用 Native Image — 在此處檢視清單。
所有主要的雲端平台也都支援使用 GraalVM Native Image 建置應用程式。您可以使用 GraalVM 在 Oracle Cloud Infrastructure 上輕鬆建置應用程式(並取得 Oracle GraalVM 作為訂閱的一部分)、在 Azure SDK for Java 和 Spring Cloud Azure 中利用 GraalVM 支援、在 AWS SDK for Java 中使用 Native Image,並使用 Google Cloud 的 Java 用戶端程式庫將應用程式編譯為原生執行檔。
作為 GraalVM 如何改進雲端 Java 部署的範例,請參閱 Disney Streaming 的使用案例。在研究如何減少其無伺服器 Java 工作負載的冷啟動時,他們發現一個在 JVM 上需要 3.6 秒才能啟動的函式,在使用 GraalVM Native Image 編譯時在 100 毫秒內啟動 — 因此快了 36 倍!即使在 512 MB 等最小記憶體中運作,原生編譯的應用程式仍然功能齊全,並且比在 JVM 上更快地啟動。
使用 JavaScript、Python 和其他語言擴展 Java
使用 GraalVM,您可以在 Java 應用程式的環境中執行 JavaScript、Python、Ruby、WebAssembly 和其他語言。它能夠使用細微的主機存取篩選器將 Java 資料結構公開給這些語言。若要開始使用,請參閱如何建置您的第一個多語系 Java 應用程式、將客體語言函式定義為 Java 值,以及直接從 Java 存取客體語言。
您也可以將 GraalVM 和 Truffle 框架用作您的語言和工具的平台。它會自動從您的語言直譯器衍生高效能程式碼,並提供對豐富工具生態系統的存取權。了解如何實作您自己的語言或工具。