Chi*_*chi 106 java jit caching jvm compilation
Sun的规范JVM实现将一些非常复杂的优化应用于字节码,以便在代码运行几次后获得接近本机的执行速度.
问题是,为什么这个编译的代码没有缓存到磁盘上以便在后续使用同一个函数/类时使用?
就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用预编译版本的代码.当字节码基本上被解释时,不会添加此功能会大大增加程序的初始运行时间吗?
Ale*_*lli 25
事实证明Oracle的JVM是这样做的 - 引用Oracle,
编译器可以利用Oracle JVM的类解析模型来选择性地跨数据库调用,会话或实例持久保存已编译的Java方法.当已知在语义上Java代码没有改变时,这种持久性避免了跨会话或实例的不必要的重新编译的开销.
我不知道为什么所有复杂的VM实现都不提供类似的选项.
ska*_*man 25
如果不采用@MYYN发布的链接的'cut'n'paste,我怀疑这是因为JVM执行的优化不是静态的,而是动态的,基于数据模式和代码模式.这些数据模式可能会在应用程序的生命周期中发生变化,从而使缓存的优化不是最佳的.
因此,您需要一种机制来确定保存的优化是否仍然是最优的,此时您可以在运行时重新进行优化.
Eug*_*gen 14
更新到现有答案 - Java 8有一个致力于解决此问题的JEP:
=> JEP 145:缓存编译代码.新链接.
在很高的层面上,其既定目标是:
保存并重用以前运行的已编译本机代码,以便缩短大型Java应用程序的启动时间.
希望这可以帮助.
Excelsior JET在2001年发布的版本2.0之后有一个缓存JIT编译器.此外,它的AOT编译器可以使用所有优化将缓存重新编译为单个DLL /共享对象.
| 归档时间: |
|
| 查看次数: |
9611 次 |
| 最近记录: |