GraalVM 中的静态编译是由其子项目 Substrate VM 框架实现的。

静态编译

静态编译经过的主要阶段:静态编译要经过类载入、准备、静态分析、全局构建、编译、生成 image 和写文件 7 个主要阶段才能将 Java 程序的字节码编译为 native image 文件。

  1. 静态分析是静态编译的基础,不但确定了要编译的代码范围,还为编译优化提供了数据基础。由于静态分析中指向分析的复杂性,静态分析阶段也是整个编译流程中耗时最大的阶段。
  2. Substrate VM 只实现到了编译的功能,将编译的代码写出为可重定向对象文件为止,并没有自己实现链接器。将可重定向对象文件链接生成最终的可执行文件或库文件的工作是在框架里调用外部编译器(如 GCC)的链接器实现的。

内存管理

GraalVM 的社区版为 Substrate VM 提供了单线程的顺序 GC(serial GC),企业版则额外提供了 G1 GC

顺序 GC 是一种无并发的单线程“停止-复制”GC,具有低内存占用、高延迟和高吞吐量的特性。Substrate VM 采用顺序 GC 最主要原因是实现简单。

native image 的内存堆设置参数与 JVM 保持了兼容。用户在启动 native image 程序时,可以在启动命令之后使用-Xmx、-Xms 等参数设置堆的内存大小。

与 OpenJDK 的无 GC 项目 Epsilon 类似,Substrate VM 也提供了无 GC 的运行模式,用参数-R:+UseEpsilonGC 开启。在无 GC 模式下,运行时不会执行 GC 操作,从而降低了系统开销,提高了程序的性能,但是事先分配的内存耗尽,就会抛出 OOM 错误。这种模式适合内存消耗少、对响应时间要求高的场景。