前言
GraalVM 可帮助开发者更好的使用 Java,主要包括三个方面:
- 通过使用最先进的 JIT 编译器使其更快,
- 将它们编译为即时启动和低内存消耗的二进制可执行文件,
- 使用支持的多语言或代码进行编程。
这份快速参考是一页的简短摘要,介绍了 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 的内置支持。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。