是否可以启用本机代码的缓存?

Is it possible to enable caching of native code?

有没有办法让 JVM 将其生成的优化本机代码缓存到文件中,以提高未来运行的性能?

提前 (AOT) 编译自 JDK 9 起可用。参见 JEP 295
注意:这与 GraalVM Native Image相同。

由于多种原因,JIT 编译代码的缓存存在问题。

  • HotSpot 编译器严重依赖推测优化。这些优化基于某些 运行 时间条件,这些条件可能与另一个 运行 并不总是相同。

  • JIT 编译代码可能引用特定对象和 类,它可能依赖于仅在 运行 时间内已知值的常量,它可能具有内存地址直接内联到指令流中。这使得缓存的代码无法直接重用。这个问题可以通过额外的间接级别来解决,这会影响性能。

这就是几个 JVM 供应商采用另一种方法的原因:缓存 运行时间配置文件数据 而不是最终代码。从之前 运行 收集的配置文件数据可以用于尽快重新编译最热门的方法(一旦满足所有先决条件),而不需要解释器中的 运行 方法再次收集配置文件.

至少有两个已知的解决方案:

Zing 虚拟机还具有 Compile Stashing 重用已编译代码本身的技术。它可以与 ReadyNow! 一起使用。

在 OpenJDK 中有一个 JEP draft 添加 JWarmup 支持。

这里有一个nice blog post关于HotSpot中的AOT编译、JIT缓存等相关技术