问题
Sun的规范JVM实现将一些非常复杂的优化应用于字节码,以便在代码运行几次后获得接近本机的执行速度。
问题是,为什么这个编译的代码没有缓存到磁盘上以便在后续使用同一个函数/类时使用?
就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用预编译版本的代码。当字节码基本上被解释时,不会添加此功能会大大增加程序的初始运行时间吗?
#1 热门回答(25 赞)
如果不采用@MYYN发布的链接的'cut'n'paste,我怀疑这是因为JVM执行的优化不是静态的,而是动态的,基于数据模式和代码模式。这些数据模式可能会在应用程序的生命周期中发生变化,从而使缓存的优化不是最佳的。
因此,你需要一种机制来确定保存的优化是否仍然是最优的,此时你也可以在运行时重新进行优化。
#2 热门回答(25 赞)
事实证明Oracle's JVM这样做 - 引用Oracle,
编译器可以利用Oracle JVM的类解析模型,可选择在数据库调用,会话或实例之间保存已编译的Java方法。当已知语义上Java代码没有改变时,这种持久性避免了跨会话或实例的不必要的重新编译的开销。
我不知道为什么所有复杂的VM实现都不提供类似的选项。
#3 热门回答(14 赞)
更新到现有答案 - Java 8有一个专门解决此问题的JEP:
=> JEP 145: Cache Compiled Code.New link。
在非常高的水平,其声明的目标是:
保存并重用以前运行的已编译本机代码,以便缩短大型Java应用程序的启动时间。
希望这可以帮助。