头图

前言

GraalVM 可帮助开发者更好的使用 Java,主要包括三个方面:

  1. 通过使用最先进的 JIT 编译器使其更快,
  2. 将它们编译为即时启动和低内存消耗的二进制可执行文件,
  3. 使用支持的多语言或代码进行编程。

这份快速参考是一页的简短摘要,介绍了 GraalVM 可以做什么,以及用来说明其功能的关键选项和命令。

图片

GraalVM 快速参考(打印请使用高清的 pdf)

你可以下载并打印到 A4 纸上,然后将它挂在办公室,提醒 GraalVM 可以做些什么和有哪些配置选项。一定要使用pdf版本打印(高清无码)。请注意,如果你的打印机更适应美国字母纸格式,请使用这个版本的 PDF

在这篇文章中,我们将快速浏览参考中的信息,并详细地介绍它。

一、运行 java 应用

第一部分侧重于运行 Java 应用程序。首先,请记住,GraalVM安装包中包含 JDK,这意味着你可以使用 GraalVM 作为 JDK。例如,使用javac编译 Java 源代码:

javac MyApp.java

当然,你也可以使用 GraalVM 来运行 Java 应用程序或任何其他 JVM 语言。除了能够运行 Java 之外,还得益于 GraalVM 强大的即时(JIT)编译器,并获得了最先进的峰值性能,通常比其他 jdk 运行得更快。

java -jar MyApp.jar

当使用 GraalVM 运行 Java 应用程序时,底层 JVM 使用的是 Java Hotspot VM,这意味着大多数配置选项是相同的,例如,你可以这样指定应用程序类路径:

java -cp target/myapp.jar com.example.Main

GraalVM 编译器通常在预编译为本机共享库模式下运行,但是其代码是用 Java 编写的,并且可以用作 JAR 文件,从而导致性能略有不同:使用堆内存进行编译会以较长的预热为代价(例如,编译器的 Java 代码需要编译)。 以下选项可配置你要运行的模式(默认情况下启用):

-XX:+-UseJVMCINativeLibrary

除了将编译器作为 JAR 或 native 库运行之外,你还可以指定优化配置economy用来加快预热速度,并选择enterprise以获得最佳的峰值性能(当然需要 GraalVM 企业版)。

-Dgraal.CompilerConfiguration=enterprise|community|economy

JIT 编译器可能会显著加快应用程序,但有时不清楚编译器是否正常工作,代码是否真正到达顶层,以及哪些方法到达编译器,你可以开启编译日志:

-Dgraal.PrintCompilation=true

除了查看日志,你还可以启用更多的调试输出,例如,打印编译器图形来分析它们,以寻找更多的优化空间:

-Dgraal.Dump=:2

当然,JVM 的其他特性也适用于 GraalVM。例如,你可以添加一个 Java agent,该 agent 将对代码进行指令插入、在运行时生成类以及其它的 Java agent 功能。基于 Java 的 agent 和 native agent 都可以运行。一个典型的例子是用于简化 native image 构建的辅助配置 agent。

-javaagent:path/to/jar.jar
-agentlib:path/to/native/agent

二、编译成二进制可执行文件

使用 GraalVM 的第二个主要优点是它的Native Image功能:提前将应用程序编译成二进制文件。使用它你需要先安装 native-image 组件。常用方法是为 GraalVM 发行版下载组件 JAR 文件,然后运行以下命令:

gu install -L native-image.jar

然后,你可以使用安装的native-image组件来生成应用程序的二进制文件:

native-image [options] MyClass

或者,你可以使用类似于 java 命令的 JAR 文件语法:

native-image -jar MyApp.jar

直接运行生成的二进制文件:

./myApp

如果你不想构建可执行文件,只是想构建一个共享库,那么可以使用--shared选项。你需要使用@CEntryPoint注解标记公开的方法,但是关于这个主题的更详细的探讨超出了本文的范围。

--shared

另一个非常有用的方法是 构建静态链接的二进制文件 ,例如将 libc 这样的操作系统库链接到可执行文件中。甚至可以选择使用哪个 libc 实现。默认情况下使用 glibc,muslc 是一个可选项,为此你需要配置一下构建环境。

--static --libc=muslc

三、多语言编程

可以运行基于Truffle-based语言的基础结构:JavaScript、Ruby、Python、R 等。这将包括该语言的解释器、Truffle 框架和 JIT 编译器,因此可以在运行时编译代码以加快执行速度。

例如,其中每一项都包括对相应语言的支持:

--language:js
--language:python
--language:llvm
--language:ruby

另一个极有吸引力的功能是 native image 可执行文件的配置文件引导优化。可以生成一个已检测的二进制文件,对其应用相关的工作负荷,记录与 JIT 相似的执行代码的概要文件,并使用这些概要文件来构建生产二进制文件。

native-image — pgo-instrument MyApp
./myApp
native-image — pgo profile.iprof MyApp

而且,如果你希望更清楚地了解本 native image 生成过程中发生的情况,例如,尝试了解类初始化的类链,你可以使用一些有用的选项。

以下选项可以开启跟踪某个类的初始化路径:

-H:+TraceClassInitialization=package.class.Name

native image 构建是一个 Java 进程,因此你可以在代码中打一个断点,通过代码调试器,全面的知晓更多细节。

--debug-attach=[port]

除此之外,还有许多其他有用的选项用来配置 native image 构建和运行时的行为,我们将在未来探讨这些配置项,你也可以通过使用帮助来了解一些可用的信息:

--expert-options-all

GraalVM 给你的第三个主要优势是一个多语言运行时,能够运行多种语言,它包括由 GraalVM 的 JavaScript 引擎供电的 Node.js 平台。因此,如果你有一个 node 应用,可以通过调用 node 命令来运行。

node myApp.js

除此之外,还有许多语言启动器可用于支持程序的运行:

js myApp.js
graalpython myApp.py
ruby myApp.rb
R myApp.r
lli myApp

默认情况下,启动器(包括 node)将在 native 模式下运行,其中解释器编译为 native image 二进制文件。因此,若要使用Java类与JVM实现互操作性,请使用--jvm选项,对于其他语言,请使用--polyglot

--polyglot --jvm

语言引擎具有许多功能来限制资源量,例如,语言上下文可以运行的时间(毫秒):

--sandbox.MaxCPUTime=Nms

四、通用开发工具

最后也是相当重要的一点就是,GraalVM 语言支持通用开发工具开箱即用。这是整个 GraalVM 生态系统中最令人兴奋的部分之一:实现一个语言解释器来修复语言的语义,并获得一个强大的虚拟机、一组 GC 算法、一个调试器、一个分析器、一个内存分析器和其他免费工具

指定以下选项以分别启用基于 Chrome DevTools 调试器、采样探查器、跟踪探查器和内存分析器的调试器:

--inspect
--cpusampler
--cputracer
--memsampler

结论

GraalVM 是一个多功能的项目,提供了许多有趣的功能,你可以将这些功能用于你的应用程序,支持 Java、JVM 语言、JavaScript、Ruby、Python、R 等。

从使用更好的即时编译器,到构建应用程序的可执行文件,再到以不同语言运行组件,现在你可以使用 GraalVM 了。

在这篇简短的参考文章中,我们试图概括GraalVM 不同功能的最常用选项。

下载 GraalVM 快速参考 PDF,打印出来,钉在墙上。让它能不断提醒你 GraalVM 项目是多么有趣,即使你目前只使用了一小部分功能。

在进行此功能时,下载GraalVM从快速参考中尝试一些东西,比如更快地运行 Java 应用程序,使用 native images 使微服务更加贴近云原生,或者使用其他语言的库来增强我们的应用程序!

译者注

译者校对:mica如梦技术、PIG冷冷、JustAuth亚东、吴天狗

原文链接:https://medium.com/graalvm/graalvm-quick-reference-b8d1dfe24241

译者说

GraalVM 无疑是 Java 未来(5~10年)的一个大方向, 期待 Spring Boot 3 和 Spring Framework 6 对 GraalVM 的内置支持。


如梦技术
59 声望7 粉丝

人生就像愤怒的小鸟,当你失败时总又几只猪在笑。