GraalVM 21.3支持Java 17、Native Image 性能更新等等


今天我们发布 GraalVM 21.3!它带来了许多社区期待已久的强大功能,在这篇博文中,我们将讨论其中一些最有趣和最有前途的功能。
21.3 是今年的最后一个版本,这意味着 GraalVM 社区版将在接下来的 12 个月内不断收到更新。因此,如果您正在考虑升级 GraalVM 版本,现在是这样做的好时机!
下载 GraalVM 21.3 社区
下载 21.3 企业版

除了基于 JDK11 的构建,GraalVM 21.3 也可用于最近发布的Java 17。这意味着除了 Java 17 的所有强大功能(例如 switch 表达式的模式匹配、密封类、平台更新等)之外,我们还可以访问 Java 17 中积累的所有 Java 11+ 功能。
 
编译器更新
与每个版本一样,Graal 编译器更新带来了新的性能优化并提升了以前的实验性功能。例如,现在默认启用非计数循环的条带挖掘优化。通过这种优化,更多的未计数循环被转换为计数循环,成为进一步优化的对象,例如矢量化和部分展开。对于大量使用非计数循环的工作负载,这会带来高达 15% 的加速。
现在默认情况下还启用了增强型自动矢量化,这在某些工作负载(例如数学密集型 ML 工作负载)上使 GraalVM Enterprise 比 OpenJDK 快 40%。
21.3 中添加的新优化之一是不可行路径相关优化,旨在消除不可行路径。

class A { ... }
class B extends A { ... }
if (x > 5) {
    if (y instanceof A) {
        throw Error();
    }
}
loop {
    int foo = <expensive computation>;
    if (x > 10) {
        if (y instanceof B) {
            bar(foo);
        }
    }
}

在条件x > 10 && y instanceof B情况下,将只执行bar(foo);如果是条件x > 5 && y instanceof A则throw Error(),bar则从不会执行。
Graal 现在认识到了这一点,如果foo仅用作bar的参数,则消除对bar的调用以及foo的计算。
此版本的 GraalVM 还引入了一个用于改进 Java 程序配置文件的捕获和分析的新工具:proftool。它旨在提供有关执行的机器级详细信息,以帮助进行 JIT 性能分析。目前,它包含一个 JVMTI 代理,用于捕获 JVM 生成的所有程序集,一个用于 Linux 性能输出的解析器,以及一个用于 HotSpot LogCompilation 信息的解析器。通过将这些组件组合到单个命令行中,性能配置文件信息可以归因于 JIT 代码。Profile collection 目前只支持 Linux perf,不过一旦数据被捕获,就可以在任何地方查看 Profile。
 
Native Image
21.3为 Native Image引入了条件反射配置。限制反射、JNI、类路径资源和动态代理对象在映像构建时所需的配置文件条目可以根据类的可达性设置条件。
例如,要支持反射访问sun.misc.Unsafe.theUnsafe仅when io.netty.util.internal.PlatformDependent0可达,配置应如下所示:

{
  "condition" : { 
   
"typeReachable" : "io.netty.util.internal.PlatformDependent0" 
  },
 
"name" : "sun.misc.Unsafe",
 
"fields" : [
    {
"name" : "theUnsafe" }
  ]
}

这可以实现更精确的配置,从而减少本机可执行文件的大小。
社区特别期待 Native Image 的另一个更新:正如我们最近的民意调查显示,开发人员希望看到 Native Image 改进的第一件事是构建时间。
21.3 中的另一个重大更新是对 Java 平台模块系统的初步支持。例如,您可以从两个 Java 模块构建映像Image:base-module.jar和app-module.jar,其中模块sample.app 包含主类:
native-image --module-path base-module.jar:app-module.jar --module sample.app

另一个与 Native Image 性能相关的重大更新是串行 GC的新策略,以减少应用程序运行时内存占用。新策略为年轻代启用了幸存者空间,该功能已存在于代码库中一段时间​​但未启用。此外,full GC 不再扫描整个映像Image 堆以查找根指针,而是仅扫描已写入映像堆的部分。
此版本中的 Native Image 还支持Java 17。除了其他功能外,它还包括用于 JDK 17 的 JDK Flight Recorder (JFR),这是 Red Hat 的贡献。
 
多语言运行时和嵌入
在此版本中,我们显着提高了内置 CPU 采样器工具的可用性和精度。CPU 采样器适用于所有多语言语言,并作为所有启动器的内置命令行工具提供。特别是在以下几个方面进行了改进:
  • 通过使用新的客户语言安全点机制提高了采样输出的精度。默认情况下,除了编译单元之外,采样输出现在还显示内联方法。
  • 简化了默认的采样直方图输出,并添加了— cpusampler.ShowTiers显示每个优化层的时间花费的选项。
  • 向 CPUSampler 添加了 SVG 火焰图输出格式。要启用它,请使用新— cpusampler.Output=flamegraph选项。

....
 
VsCode 
此外,通过GraalVM Tools for Java 扩展启用的VS Code 中的 Native Image 调试得到了显着改进。现在您可以将调试器附加到 Native Image 进程并跳过图像“真实”代码。将调试器附加到本机可执行文件是通过向 launch.json 添加配置来完成的。在launch.json文件的配置完成中选择:“ Native Image: Attach to Process ”,会生成“ Attach to Native Image ”配置。选择并执行此配置后,您将看到正在运行的进程列表。
在此版本中,GraalVM Tools for Micronaut Extension添加了对 Kubernetes 的支持:现在您可以直接从 Visual Studio Code在 Kubernetes 集群中部署、运行和调试 Micronaut 应用程序。