为什么选择 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 十多年研究的成果,包括一些新的优化,例如 高级内联部分逃逸分析代码复制 以及 推测优化。GraalVM 本身是用 Java 而不是 C/C++ 编写的,这简化了维护,并帮助我们更快地开发和交付新的优化。

一些公司,例如 Oracle CloudTwitterFacebook 正在 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 BootMicronautQuarkusHelidon 提供 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 将应用程序编译为原生可执行文件。

例如,看看 Disney Streaming 的用例,了解 GraalVM 如何改进云 Java 部署。在研究如何缓解无服务器 Java 工作负载的冷启动问题时,他们发现,使用 GraalVM Native Image 编译的函数在 JVM 上启动需要 3.6 秒,而启动时间不到 100 毫秒 - 速度提高了 36 倍!即使在 512 MB 等最小内存内运行,原生编译的应用程序仍然功能齐全,并且启动速度比 JVM 上的应用程序快得多。

使用 JavaScript、Python 和其他语言扩展 Java

使用 GraalVM,您可以在 Java 应用程序的上下文中运行 JavaScript、Python、Ruby、WebAssembly 和其他语言。它提供将 Java 数据结构暴露给这些语言的能力,并提供细粒度的主机访问过滤器。要开始,请了解如何 构建您的第一个多语言 Java 应用程序将访客语言函数定义为 Java 值 以及 从 Java 访问访客语言

您还可以将 GraalVM 和 Truffle 框架 作为您的语言和工具的平台。它会自动从您的语言解释器派生高性能代码,并提供对丰富的工具生态系统的访问。了解如何实现 自己的语言工具

联系我们