2011-10-21 57 views
14

在关于热点JIT的讲座中,我想尽可能多地提供JIT执行的特定优化的示例。热点JIT优化

我知道的只是“方法内联”,但应该有更多。为每个例子投票。

回答

13

那么,你应该扫描Brian Goetz的文章作为例子。

简言之,热点可以和将:

  1. 内联方法
  2. 加入在同一对象上相邻​​块
  3. 消除锁如果显示器不能从其他线程到达
  4. 消除死代码(因此大多数微基准是无意义的)
  5. 删除内存写入非volatile变量
  6. 更换接口调用与直接法要求只执行一次方法

等等

2

跳转到等效的本机机器码,而不是JVM对操作码的解释。对于Java应用程序的高度使用部分(这相当于JVM的扩展),机器代码中不需要模拟机器(JVM),可以提高速度。

当然,这是HotSpot的大部分。

4

this article有一个旧的,但可能仍然有效的概述。

亮点似乎基于可用的运行时分析信息,以表演古典优化:

  • JITting“热点”为本地代码
  • 自适应内联 - 内联最常调用实现对某个方法分派以避免庞大的代码大小

而一些次要的代码,如分配短生命的对象更便宜,以及各种其他较小的优化,再加上任何其他广告自该文章发表以来。

还有一个更详细的official whitepaper,和一个相当基本事实HotSpot Internals wiki page,其中列出了如何编写快速Java代码应该让你推断什么用例进行了优化。

7

我认为有趣的东西是常规编译器无法做到的与JIT相反的事情。内联方法,消除死代码,CSE,实时分析等。都是由你的普通C++编译器完成的,在这里没有什么“特别的”

但是基于乐观的假设优化某些东西,然后如果它们最终会错误的时候去优化呢? (假设一个特定的类型,删除分支,如果没有完成,将会失败,以后无论如何......)如果我们可以保证现在只存在一个类,那么删除虚拟调用(又是只能可靠地与去最优化一起工作的东西)?自适应优化是我认为真正区分JIT和运行C++编译器的一件事。

也许还会提到由JIT完成的运行时概要分析,以分析应该应用哪种优化(尽管如此,并非所有配置文件指导的优化都是唯一的)。