为什么 JVM 不缓存 JIT 编译的代码?
2022-08-31 09:11:42
来自 Sun 的规范 JVM 实现对字节码应用了一些非常复杂的优化,以便在代码运行几次后获得接近本机的执行速度。
问题是,为什么这个编译后的代码没有缓存到磁盘上,以便在后续使用相同的函数/类时使用?
就目前而言,每次执行程序时,JIT编译器都会重新开始,而不是使用预编译版本的代码。添加此功能难道不会大大增加程序的初始运行时,当字节码基本上被解释时吗?
来自 Sun 的规范 JVM 实现对字节码应用了一些非常复杂的优化,以便在代码运行几次后获得接近本机的执行速度。
问题是,为什么这个编译后的代码没有缓存到磁盘上,以便在后续使用相同的函数/类时使用?
就目前而言,每次执行程序时,JIT编译器都会重新开始,而不是使用预编译版本的代码。添加此功能难道不会大大增加程序的初始运行时,当字节码基本上被解释时吗?
在不诉诸于剪切粘贴@MYYN发布的链接的情况下,我怀疑这是因为JVM执行的优化不是静态的,而是动态的,基于数据模式和代码模式。这些数据模式可能会在应用程序的生存期内发生变化,从而使缓存的优化效果不尽如人意。
因此,您需要一种机制来确定保存的优化是否仍然是最佳优化,此时您不妨动态重新优化。
Oracle的JVM确实记录了这样做 - 引用Oracle,
编译器可以利用 Oracle JVM 的类解析模型,可以选择跨数据库调用、会话或实例持久保存已编译的 Java 方法。这种持久性避免了跨会话或实例进行不必要的重新编译的开销,因为众所周知,在语义上 Java 代码没有更改。
我不知道为什么所有复杂的VM实现都不提供类似的选项。