GraalVM快速参考指南 - graalvm


GraalVM是一个通用项目,提供许多有趣的功能,您可以将它们用于您的应用程序,包括Java,JVM语言,JavaScript,Ruby,Python,R等。
从使用更好的即时编译器,到构建应用程序的本机可执行文件,再到以不同语言运行组件,您现在都可以使用GraalVM。
在此快速参考中,我们尝试概述最常用的选项,这些选项描述了GraalVM的不同功能。
GraalVM可以通过三种主要方法来帮助Java应用程序:通过使用最新的JIT编译器来使其更快,通过即时启动和低内存消耗将它们编译为独立的本机可执行文件,以及可运行其他语言的代码或库。
 
第一部分着重于运行Java应用程序。最重要的是,要记住GraalVM发行版包含一个包含所有常用JDK工具的JDK,这意味着您可以将GraalVM用作您的JDK。例如,使用javac实用程序编译Java源代码:

javac MyApp.java
 

当然,您也可以使用GraalVM运行Java应用程序或任何其他JVM语言。除了能够运行Java之外,GraalVM还受益于其强大的实时(JIT)编译器并达到了最新的峰值性能,通常比其他JDK更快地运行它们。
java -jar MyApp.jar

 
使用GraalVM实时运行Java应用程序时,底层JVM是通常的Java Hotspot(tm)VM,这意味着大多数配置选项是等效的,例如,指定应用程序的类路径的工作方式如下:
java -cp target/myapp.jar com.example.Main
 

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

 
除了将编译器作为JAR或本机库运行之外,您还可以指定用于优化的配置,用economy实现更快的预热和enterprise最佳的峰值性能(当然需要GraalVM Enterprise)。
-Dgraal.CompilerConfiguration=enterprise|community|economy

 
JIT编译器的影响可以极大地加速应用程序的运行,但是有时尚不清楚编译器是否正常工作,代码是否真正到达顶层以及哪些方法可以到达编译器。

-Dgraal.PrintCompilation=true

 
除了查看日志外,还可以启用更多调试输出,例如,打印编译器图以对其进行分析,以寻找更多的优化机会:
-Dgraal.Dump=:2

 
当然,JVM的其他功能也可以与GraalVM一起使用。例如,您可以附加一个Java代理,它将检测代码,在运行时生成类以及其他Java“代理”内容。基于Java的代理和本机代理都可以工作。一个值得注意的例子是用于简化本机镜像或映像构建的辅助配置代理。
-javaagent:path/to/jar.jar
-agentlib:path/to/native/agent

 
使用GraalVM的第二个主要优点是其本机映像功能:提前将应用程序编译成本机二进制文件。为了使用它,您需要安装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

 
另一个非常有用的可能性是构建静态链接的二进制文件,其中将类似的OS库libc链接到可执行文件中。甚至有可能选择libc要使用的实现。glibc默认情况下使用,muslc是一个选项,您需要为此稍微准备构建环境。
--static --libc=muslc

 
可运行基于Truffle的语言的基础结构:JavaScript,Ruby,Python,R等。这将包括该语言的解释器,Truffle框架和JIT编译器,因此可以在运行时编译代码以加快执行速度。
例如,每一个都将包括对相应语言的支持:
例如,每一个都将包括对相应语言的支持:
--language:js 
--language:python 
--language:llvm 
--language:ruby

 
另一个引人入胜的功能是针对本机映像可执行文件的配置文件引导的优化。您可以生成一个已检测的二进制文件,对其应用相关的工作负荷,记录与JIT相似的执行代码的概要文件,并使用这些概要文件来构建生产二进制文件。
native-image — pgo-instrument MyApp
./myApp
native-image — pgo profile.iprof MyApp

 
如果您想更清楚地了解本机映像构建过程中发生的情况,例如,尝试了解初始化类所依据的类链,则可以使用一些有用的选项。
通过以下方法可以将初始化路径跟踪到某个类:
-H:+TraceClassInitialization=package.class.Name
 

本机映像构建是一个Java流程,因此您可以在代码中放置一个断点并将调试器附加到该断点上,以全面了解正在发生的事情。
--debug-attach=[port]

 
除此之外,还有很多其他有用的选项可用于配置本机映像构建和运行时行为,我们将在以后进行探讨,但是您可以使用专家帮助选项来了解可用的内容:
--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这样的启动程序默认情况下在纯模式下运行,在该模式下,解释器被编译为本地图像二进制文件。因此,要启用与JVM的互操作性以使用Java类,请使用--jvmoption和for其他语言--polyglot:
--polyglot --jvm

语言引擎具有许多功能来限制资源量,例如语言上下文可以运行的时间(以毫秒为单位):
--sandbox.MaxCPUTime=Nms

 
最后但并非最不重要的一点是,GraalVM语言支持开箱即用的通用开发人员工具。这是整个GraalVM生态系统中最激动人心的部分之一-实施语言解释器,以修复语言的语义,并获得功能强大的虚拟机,精选的GC算法,调试器,分析器,内存分析器和其他工具。
指定以下选项以分别启用基于Chrome DevTools调试器的调试器,采样分析器,跟踪分析器和内存分析器:
--inspect
--cpusampler
--cputracer
--memsampler

 
 下载本指南图