多语言虚拟机 GraalVM 为使用多种语言(如 Java、C 语言、Python 和 JavaScript)开发的应用程序提供了共享运行时。最新版本 19.3 已发布,支持 JDK 11。之前的版本基于 JDK 8。
GraalVM 限制支持大量介于 Java 9 和 Java 11 之间的语言特性和平台改进,如紧凑的字符串、变量类型推断、Java 平台模块系统(JPMS)和 HTTP 客户端。
例如,下面的代码片段演示了使用最新的 Java 11 HTTP 客户端向比特币网站发送一个简单的请求:
复制代码
publicclassBPI { public static void main(String... args) { var request = HttpRequest .newBuilder() .uri(URI.create("https://api.coindesk.com/v1/bpi/currentprice.json")) .GET() .build(); var response = HttpClient .newHttpClient() .send(request,HttpResponse.BodyHandlers.ofInputStream()); var json = Json .createReader(response.body()) .readObject() .getJsonObject("bpi"); … System.out.printf("Current Bitcoin Price: $%s %s", price, indicator); } }
在将 GraalVM 的安装路径加入到 JAVA_HOME 和 PATH 中之后,就可以使用 javac 命令或 Maven 构建工具来编译基于 Java 11 的类(如上述的 Java 类)。
GraalVM 的本地镜像生成器也支持 Java 11,作为早期采用者技术特性。本地镜像是一种提前编译的 Java 字节码包,可独立执行。本地镜像具有启动速度快、占用空间小的特点。但要注意的是,本地镜像不支持 Java 平台模块系统,在运行时不具备模块自检功能。native-image 是一个可选包,可通过 GraalVM 更新程序 gu 来安装。gu 是一个包管理器,可用于下载和安装不包含在 GraalVM 发行版中的包。
下面的代码片段演示了如何安装 native-image、基于上述的类构建一个本地镜像,并执行生成的文件:
复制代码
gu installnative-image native-image -cp example.jar/ --enable-url-protocols=https/ my.example.BPI
使用 Maven 作为构建工具的用户可以使用 Maven 插件 来生成镜像。
另外需要注意的是,因为 G1 是 Java 11 的默认垃圾回收器,所以在将对性能比较敏感的应用程序从 JDK 8 迁移到 JDK 11 时,需要特别小心。
除了支持 JDK 11,这个 GraalVM 长期支持(LTS)版本也在其他多个方面做出了改进,如本地镜像生成、GraalVM 编译器、代码覆盖、GraalVM VisualVM,升级 NodeJS、Python 和 R 语言运行时。GraalVM 19.3 的 版本公告 提供了全部的改进和增强信息。