为什么选择 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 用 Graal 编译器替换了 JVM 中最后一层优化编译器 (C2)。该编译器是 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 构建应用程序。您可以在 Oracle Cloud Infrastructure 上轻松使用 GraalVM 构建应用程序(并作为订阅的一部分获得 Oracle GraalVM 的访问权限),利用 Azure SDK for Java 和 Spring Cloud Azure 中对 GraalVM 的支持,在 AWS SDK for Java 中使用 Native Image,并使用 Google Cloud 的 Client Libraries for 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 框架作为您的语言和工具的平台。它将自动从您的语言解释器中派生出高性能代码,并提供对丰富的工具生态系统的访问。了解如何实现您自己的语言或工具。