热点JIT优化
在关于Hotspot中的JIT的讲座中,我想尽可能多地给出JIT执行的特定优化的示例。
我只知道“方法内联”,但应该有更多。 为每个例子投票。
好吧,你应该扫描Brian Goetz的文章作为例子。
简而言之,HotSpot可以并且将:
- 内联方法
- 加入同一对象上的相邻
synchronized
块 - 如果无法从其他线程访问监视器,则消除锁定
- 消除死代码(因此大多数微基准测试都没有意义)
- 删除非易失
volatile
变量的内存写入 - 使用直接方法调用替换接口调用,只执行一次方法
等等
现代JVM在Jikes RVM站点上使用的优化有很好的演示: ACACES’06 – 虚拟机中的动态编译和自适应优化
它讨论了架构,权衡,测量和技术。 并且至少列出了JVM为优化机器代码所做的20件事。
我认为有趣的东西是传统编译器不能与JIT相反的东西。 内联方法,消除死代码,CSE,实时分析等都是由你的普通c ++编译器完成的,这里没什么“特别的”
但是,基于乐观的假设来优化某些东西,如果结果出现错误,那么以后会进行去优化? (假设一个特定的类型,删除将在以后无论如何都会失败的分支,…)如果我们可以保证目前只存在一个类(再次只能与去优化一起可靠地工作),删除虚拟调用? 自适应优化是我认为真正区分JIT与mill c ++编译器运行的一件事。
也许还要提到JIT完成的运行时分析,以分析它应该应用哪些优化(不过那时所有的配置文件引导的优化都不再那么独特)。
本文中有一个旧的但可能仍然有效的概述。
亮点似乎是基于可用的运行时分析信息执行经典优化:
- 将“热点”引入本机代码
- 自适应内联 – 为给定的方法分派内联最常用的实现,以避免巨大的代码大小
还有一些次要的,比如代际GC,这使得分配短寿命对象更便宜,以及各种其他更小的优化,以及自该文章发布以来添加的任何其他内容。
还有一个更详细的官方白皮书 ,以及一个相当细致的HotSpot Internals wiki页面 ,其中列出了如何编写快速Java代码,以便您可以推断出哪些用例已经过优化。
跳转到等效的本机机器代码而不是操作码的JVM解释。 对于Java应用程序的大量使用部分(相当于JVM的扩展)而言,不需要在机器代码中模拟机器(JVM)提供了良好的速度提升。
当然,这就是HotSpot的大部分内容。