是否可以启用本机代码的缓存?
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缓存等相关技术
有没有办法让 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缓存等相关技术