【译】GraalVM 快速参考

JAVA架构日记

共 5137字,需浏览 11分钟

 ·

2021-01-19 08:52

前言

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

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

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

图片

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

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

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

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

-XX:+-UseJVMCINativeLibrary

除了将编译器作为 JAR 或 native 库运行之外,你还可以指定优化配置[4]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[5]功能:提前将应用程序编译成二进制文件。使用它你需要先安装 native-image 组件。常用方法是为 GraalVM 发行版下载组件 JAR 文件,然后运行以下命令:

gu install -L native-image.jar

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

native-image [options] MyClass

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

native-image -jar MyApp.jar

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

./myApp

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

--shared

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

--static --libc=muslc

三、多语言编程

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

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

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

另一个极有吸引力的功能是 native image 可执行文件的配置文件引导优化[9]。可以生成一个已检测的二进制文件,对其应用相关的工作负荷,记录与 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 给你的第三个主要优势是一个多语言运行时[10],能够运行多种语言,它包括由 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

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

--sandbox.MaxCPUTime=Nms

四、通用开发工具

最后也是相当重要的一点就是,GraalVM 语言支持通用开发工具[12]开箱即用。这是整个 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 的内置支持。

连接

[1]

pdf版本: https://www.graalvm.org/uploads/1p/graalvm-quick-reference_a4.pdf

[2]

这个版本的 PDF: https://www.graalvm.org/uploads/1p/graalvm-quick-reference_us-letter.pdf

[3]

预编译为本机共享库模式下运行: https://www.graalvm.org/reference-manual/compiler/#compiler-operating-modes

[4]

优化配置: https://www.graalvm.org/reference-manual/jvm/Options/

[5]

Native Image: https://www.graalvm.org/reference-manual/native-image/

[6]

可执行文件: https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/#create-a-shared-library

[7]

构建静态链接的二进制文件: https://www.graalvm.org/reference-manual/native-i

[8]

Truffle 框架: https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/

[9]

配置文件引导优化: https://www.graalvm.org/reference-manual/native-image/PGO/

[10]

多语言运行时: https://www.graalvm.org/reference-manual/polyglot-programming/

[11]

限制资源量: https://docs.oracle.com/en/graalvm/enterprise/20/docs/reference-manual/embed-languages/sandbox/

[12]

通用开发工具: https://www.graalvm.org/docs/tools/


往期推荐

久等 | Spring Cloud Alibaba 2.2.4 发布

2021 首发 | Spring Boot 2.4.2 发布

伊尔福德站正式通车!Spring Cloud 2020 发布

Spring Boot 2.4.0 正式发布,全面拥抱云原生

SpringCloud LoadBalancer灰度策略实现



浏览 79
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报