为什么不JVM编译代码的JVM缓存?

来自Sun的规范JVM实现将一些非常复杂的优化应用于字节码,以在代码运行几次后获得接近原生的执行速度。

问题是,为什么这个编译后的代码不会被缓存到磁盘中以供后续使用相同的函数/类时使用?

就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用预编译版本的代码。 当字节码基本上被解释时,不会添加这个功能会大大增加程序的初始运行时间?


不要诉诸@MYYN发布的链接,我怀疑这是因为JVM执行的优化不是静态的,而是基于数据模式和代码模式的动态优化。 这些数据模式很可能会在应用程序的生命周期中发生变化,导致缓存的优化不够理想。

所以你需要一种机制来确定保存的优化是否仍然是最优的,在这一点上,你可能只是在即时重新优化。


Oracle的JVM确实被记录下来 - 引用Oracle,

编译器可以利用Oracle JVM的类解析模型来选择性地在数据库调用,会话或实例中持久化编译的Java方法。 当知道Java代码在语义上没有改变时,这种持久性避免了会话或实例之间不必要的重新编译的开销。

我不知道为什么所有复杂的VM实现都不提供类似的选项。


更新到现有的答案 - Java 8有一个JEP专门用来解决这个问题:

=> JEP 145:缓存编译代码。 新的链接。

在很高的层面上,其明确的目标是

为了提高大型Java应用程序的启动时间,保存并重用先前运行的已编译本机代码。

希望这可以帮助。

链接地址: http://www.djcxy.com/p/86557.html

上一篇: Why doesn't the JVM cache JIT compiled code?

下一篇: why is for loop faster than while loop