加速 Java 性能
GraalVM 的高性能 JIT 编译器可生成优化的原生机器代码,凭借一系列高级编译器优化以及激进而复杂的内联技术,使得代码运行速度更快,产生更少的垃圾,并使用更少的 CPU。最终结果是应用程序运行速度更快,消耗资源更少——从而降低了云和基础架构成本。
图 1. 相较于 OpenJDK 11 的加速比
加速比的大小取决于工作负载的类型。在 Renaissance 基准测试套件上,该套件“包含一系列现代工作负载,由各种流行的针对 JVM 构建的系统、框架和应用程序组成”,Oracle GraalVM 相较于 OpenJDK 8 实现了 1.55 倍的几何平均加速比,并对 OpenJDK 11 取得了类似的结果。
Oracle 云基础设施
通过在 Oracle GraalVM 上运行 Oracle 云基础设施 (OCI) 监控(遥测)服务,实现了 10% 的事务处理速率提升,同时垃圾回收时间减少 25%,GC 暂停时间减少 17%,CPU 利用率降低 5%。这些改进对于一个内存密集型服务具有显著的优势,该服务日常处理数千万数据点,摄取数十亿指标,并响应来自不断增长的 OCI 服务产品的数百万请求。
图 2. OCI 监控服务吞吐量(每秒事务数)
降低基础设施成本
更高的应用程序性能和更低的 CPU 及内存使用率是每位开发人员都追求的目标。这些目标无疑值得称赞,并且借助 GraalVM 更容易实现,但这些改进的真正价值在于降低了在生产环境中运行应用程序的成本。资源需求更低、运行速度更快的应用程序意味着提供给定服务所需的服务器更少,而服务器更少则意味着更低的每月云账单以及更低的本地部署资本和运营成本。
计算很简单。即使没有资源需求的减少,仅凭约 11% 的吞吐量提升,9 台服务器就能完成以前需要 10 台服务器才能完成的工作。这意味着可以少支付一台云服务器的费用,或者少购买和维护一台数据中心服务器。
Oracle GraalVM 是我们戴尔 EMC 服务器的性能首选。Java 工作负载分析和 SPECjbb®2015 基准测试将 max-jOPS 结果提高了近 8%。
值得发推特分享的亮点
Twitter 是全球最受欢迎的社交媒体服务之一,其平台每天被全球数百万用户使用。为了降低成本并提升性能,Twitter 依赖 GraalVM 来运行其核心服务,如推文(Tweet)、社交(Social)和新闻(News)。借助 GraalVM JIT 编译器的效率,Twitter 能够以更少的服务器达到其吞吐量目标,从而实现了显著的节约。
能够在不更改底层代码的情况下,在相同的硬件上实现 8-11% 的性能提升,这是一生中难得的事件,为 Twitter 带来了可观的成本节约和未来的灵活性。
无需更改代码即可获得更优性能
尽管 OpenJDK 项目以 6 个月的发布周期向前推进,提供了一种基于时间的发布模型,即功能准备就绪即可发布,但 Java 生态系统的很大一部分仍在使用 Java 8 和 Java 11 进行生产。
GraalVM 致力于改进 Java 生态系统,并支持那些最受欢迎的主要版本。GraalVM 包含一个兼容的 JDK,目前提供基于 Java 8 或 Java 11 的下载。要使用 GraalVM 加速 Java 应用程序、使用 Native Image 功能构建原生可执行文件或集成其他语言的库,您无需进行复杂的迁移到最新的 OpenJDK 版本。将服务迁移到 GraalVM 主要包括将 JDK 下载或基础容器镜像替换为基于 GraalVM 的版本,无需更改代码或利用新的语言特性!
同样卓越的开发人员生产力
GraalVM 最好的特性之一是它与 Java 生态系统中所有工具的兼容性。GraalVM 可以在不更改代码或无需开发人员学习曲线的情况下运行 Java 应用程序,提供更好的性能。GraalVM 适应您的工作流程,作为一个兼容的 JDK,它不仅可以运行您正在处理的应用程序,还可以运行帮助您的 Java 工具!GraalVM 适用于您的调试器,适用于您的构建工具,它适用于您最喜欢的 IDE,您可以将您的持续集成环境迁移到它上面,在其上运行您的问题跟踪器以及您正在使用的所有其他 Java 服务。
您甚至不必是 Java 开发人员!如果其他 JVM 语言是您的生产力之源,那也没关系。从 Kotlin 到 Clojure,再到 Scala,GraalVM 也可以帮助您以出色的性能运行它们。
GraalVM 将 Java 生态系统和社区的力量与更强大的 JDK 分发版相结合,实现了两全其美。
受行业领先的 Java 应用程序框架支持
GraalVM 受到行业领先的 Java 应用程序框架的支持,常被誉为 Java 生态系统中最令人兴奋的创新。例如,能够利用 Native Image 技术将应用程序编译为原生可执行文件的能力,彻底改变了 Java 应用程序的云部署。这对于微服务尤为重要,因为微服务中的单个服务要么被整齐地封装在内存受限的环境中,要么迅速成为云成本的主要部分。幸运的是,借助 GraalVM,您无需用 Go 语言重写应用程序即可在云中取得成功。大多数主要的 Java 应用程序和微服务框架都考虑了 GraalVM Native Image,或正在致力于添加一流支持。
适用于微服务的 Micronaut、Helidon、Quarkus 或 Spring Boot,适用于命令行应用程序的 PicoCLI——无论您面临何种任务,都有一个与 GraalVM Native Image 兼容的框架可供选择,使您的工作更轻松。
扩展 Java 生态系统
Java 虚拟机 (JVM) 使 Java 程序能够在从小型嵌入式设备到大型机的所有设备上运行。它是一个高性能运行时,抽象了底层硬件和操作系统平台的细节,以实现代码的可移植性。但事实证明,JVM 在执行编译为中间 Java 字节码格式的程序时,实际上并不了解 Java 语言本身。这意味着任何可以编译为 Java 字节码的语言都可以在 JVM 上运行,例如 Scala、Kotlin 和 Clojure。然而,有许多流行的语言不编译为 Java 字节码,因此无法利用 JVM 提供的优势和即时编译的性能优势。
但得益于创新的 Truffle 语言实现框架,GraalVM 确实支持在 JVM 上执行多种流行编程语言,包括 JavaScript/Node.js、Ruby、Python 和 R。它还支持编译为 LLVM 位码或 WebAssembly (Wasm) 的 C、C++ 及其他语言。GraalVM 和 Truffle 不仅使非 Java 字节码程序能够在 JVM 上运行,Truffle 还使这些语言能够受益于 GraalVM 的高级优化编译器技术,从而运行得更快、更精简——就像在 GraalVM 上运行的 Java 应用程序一样。在所有情况下,GraalVM Truffle 语言在 JVM 上的性能都与在其原始运行时上运行一样快,通常还会快很多倍。
TruffleRuby 在速度方面潜力巨大,因为它在 optcarrot 基准测试中比 CRuby 快九倍。
图 4. GraalVM Truffle 语言
打破壁垒
除了 GraalVM 能够运行多种语言编写的程序外,它还可以运行使用多种语言的程序!有数千个有用的 Node.js 包、Python 库和 Java 库,可以被 GraalVM 支持的任何语言使用。这使得一些用例成为可能,例如结合 Python 机器学习功能的 Java 微服务,或者使用 R 进行统计数据分析的 JavaScript 程序。
GraalVM 的多语言支持使得拥有不同语言和领域专长的开发人员能够协作。例如,荷兰国家警察使用 GraalVM 将 R 代码集成到用 Java 和 Scala 编写的 Spring Boot Web 服务中。这使得他们的数据科学家可以用 R 编写代码进行数据分析,而他们的 Java 和 Scala 开发人员则构建与 Apache Kafka 交互的服务。
在 Scala/JVM 项目中嵌入 R 代码是使用 R 中可用的强大数据处理包的绝佳方式……这意味着您(或您的数据科学家)可以使用专门的编辑器(例如 RStudio)来创建功能的 R 部分,同时您可以使用自己喜欢的编辑器来处理 JVM 部分(例如 IntelliJ)。