# 1 楼答案 自JDK 9以来,就可以使用提前(AOT)编译。见JEP 295 注意:这与GraalVM本机图像不同 JIT编译代码的缓存有几个问题 热点编译器严重依赖于推测性优化。这些优化基于某些运行时条件,这些条件在不同的运行中可能并不总是相同的 JIT编译的代码可能引用特定的对象和类,它可能依赖于仅在运行时已知值的常量,它可能将内存地址直接内联到指令流中。这使得缓存的代码无法直接重用。这个问题可以通过额外的间接级别来解决,这将影响性能 这就是为什么一些JVM供应商采取了另一种方法:缓存运行时概要文件数据,而不是最终代码。然后,可以使用从上一次运行中收集的概要文件数据尽快重新编译最热门的方法(一旦满足所有先决条件),而无需在解释器中运行方法来再次收集概要文件 至少有两种已知的解决方案: JWarmup可在阿里巴巴龙井获得李> ReadyNow!在Azul-Zing中提供李> Zing虚拟机也有Compile Stashing技术来重用编译后的代码本身。它可以与ReadyNow!一起使用 有一个JEP draft可以在OpenJDK中添加JWarmup支持 下面是一篇关于热点中AOT编译、JIT缓存和相关技术的文章
# 1 楼答案
自JDK 9以来,就可以使用提前(AOT)编译。见JEP 295
注意:这与GraalVM本机图像不同
JIT编译代码的缓存有几个问题
热点编译器严重依赖于推测性优化。这些优化基于某些运行时条件,这些条件在不同的运行中可能并不总是相同的
JIT编译的代码可能引用特定的对象和类,它可能依赖于仅在运行时已知值的常量,它可能将内存地址直接内联到指令流中。这使得缓存的代码无法直接重用。这个问题可以通过额外的间接级别来解决,这将影响性能
这就是为什么一些JVM供应商采取了另一种方法:缓存运行时概要文件数据,而不是最终代码。然后,可以使用从上一次运行中收集的概要文件数据尽快重新编译最热门的方法(一旦满足所有先决条件),而无需在解释器中运行方法来再次收集概要文件
至少有两种已知的解决方案:
Zing虚拟机也有Compile Stashing技术来重用编译后的代码本身。它可以与ReadyNow!一起使用
有一个JEP draft可以在OpenJDK中添加JWarmup支持
下面是一篇关于热点中AOT编译、JIT缓存和相关技术的文章