JIT编译的缺点是什么?

时间:2010-10-27 21:41:16

标签: java jit

及时编译具有许多理论上的优势:它有关于机器,标志状态以及代码使用方式的更多信息。 它允许您在运行之前避免耗时的编译,从而加快开发周期。

简单地说,JIT编译似乎是一种优越的方法;有一些开销,但如果足够智能,它可以加速你的代码足以抵消它。

但是,我不认为这就是整个故事。理论和实践的缺点是什么? 是的,经常提到“启动时间较慢”,“内存消耗增加”,但是 我想知道是否还有更多。

例如,跟踪和JIT编译会丢弃cpu缓存吗? 如果你的程序很大并且没有太多特别热门的路径,那么是否存在花费更多时间跟踪和JIT-ting的风险?

似乎有人写了一篇论文或解决JIT中固有的问题。如果有人有测量,那就更好了。

编辑:我说的是及时编译,与提前编译相比(可能是反馈导向优化),而不是与解释相比。

3 个答案:

答案 0 :(得分:1)

如果JIT工作正常,则没有真正的劣势。话虽如此,Sun需要很长时间来稳定Hotspot,因为它非常复杂。关于基准数据,您始终可以运行以下实验:

运行SPECjbb,SPECjvm或您自己的基准测试并修改执行java的命令行以包含:

-Xint

这将排除任何运行时编译。

答案 1 :(得分:1)

  

例如,跟踪和JIT编译会丢弃cpu缓存吗?如果你的程序很大并且没有太多特别热门的路径,那么是否存在花费更多时间跟踪和JIT-ting的风险?

这是合情合理的。但是整个优化游戏是关于在各种因素中进行折衷以在一般情况下获得最佳结果 。大多数应用程序都有相对冷热路径,即使热路径都在标准类库中。

除了你实际上说的是这个假设的应用程序根本不值得JIT编译。在这种情况下,“修复”将在关闭JIT编译的情况下运行它。

  

似乎有人写了一篇论文或解决JIT中固有的问题。

你已经这么想过了。

但另一方面,由于商业原因,在Oracle,IBM等JVM中构建和维护JIT编译器的人可能会被限制告诉全世界他们的想法和结果。 (发布源代码是一回事,但解释为什么他们选择了一个特定的策略是另一回事。)还有动机问题。

答案 2 :(得分:0)

主要问题是当前VM必须加载 - 这是将整个编译器和运行时加载到内存中,因此它不会很快。

一旦加载,编译和分析可以在后台长期完成,理论上可以比任何静态编译语言快得多,通过手工优化来适应运行时情况。 (考虑一下函数被确定为没有副作用并且不依赖于使用相同参数调用50次的外部数据的情况 - 动态编译的语言可以简单地学习返回常量。这是某种东西。静态编译的语言根本无法做到。)

请注意,这并不一定会成为VM的问题,如果他们开始将虚拟机构建到操作系统中并在多个应用程序之间重用虚拟机,这个问题就会消失。

vm字节码也可以用更少的字节来做更多的事情。这就是微软最初在Excel / Word(pre-java)中使用虚拟机的原因,它只是为了减少代码大小。

这部分只是猜想,但我认为这意味着可以优化自定义CPU以便更快地运行,因为读/写不会成为瓶颈。 RISC系统倾向于认为CPU操作而不是I / O是瓶颈,我不相信这总是正确的 - 在单个“操作码”中做更多的工作应该意味着CPU制造商有更多的机会来优化他们的硬件

我的观点?没有固有的缺点,主要的现实缺点是加载时间。

哦,另一个现实世界的缺点,Java和C#倾向于在堆上分配所有对象。 C#/ Java中的堆分配比使用C ++快得多,但仍然达不到堆栈分配速度。