18、即时编译器的中间表达形式

在上一章中,我利用了程序控制流图以及伪代码,来展示即时编译器中基于profile的优化。不过,这并非实际的优化过程。 1. 中间表达形式(IR)在编译原理课程中,我们通常将编译器分为前端和后端。其中,前端会对所输入的程序进行词法分析、语法分析、语义分...

深入拆解Java虚拟机

19、 Java字节码(基础篇)

在前面的篇章中,有不少同学反馈对Java字节码并不是特别熟悉。那么今天我便来系统性地介绍一遍Java字节码。 操作数栈我们知道,Java字节码是Java虚拟机所使用的指令集。因此,它与Java虚拟机基于栈的计算模型是密不可分的。 在解释执行过程中,每...

深入拆解Java虚拟机

20、方法内联(上)

在前面的篇章中,我多次提到了方法内联这项技术。它指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 方法内联不仅可以消除调用本身带来的性能开销,还可以进一步触发更多的优化。因此,它可以算是编译优化里最...

深入拆解Java虚拟机

21、方法内联(下)

在上一篇中,我举的例子都是静态方法调用,即时编译器可以轻易地确定唯一的目标方法。 然而,对于需要动态绑定的虚方法调用来说,即时编译器则需要先对虚方法调用进行去虚化(devirtualize),即转换为一个或多个直接调用,然后才能进行方法内联。 即时编...

深入拆解Java虚拟机

22、HotSpot虚拟机的intrinsic

前不久,有同学问我,String.indexOf方法和自己实现的indexOf方法在字节码层面上差不多,为什么执行效率却有天壤之别呢?今天我们就来看一看。 12345678910public int indexOf(String str) {...

深入拆解Java虚拟机

23、逃逸分析

我们知道,Java中Iterable对象的foreach循环遍历是一个语法糖,Java编译器会将该语法糖编译为调用Iterable对象的iterator方法,并用所返回的Iterator对象的hasNext以及next方法,来完成遍历。 12345p...

深入拆解Java虚拟机