22、HotSpot虚拟机的intrinsic

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

深入拆解Java虚拟机

21、方法内联(下)

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

深入拆解Java虚拟机

20、方法内联(上)

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

深入拆解Java虚拟机

19、 Java字节码(基础篇)

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

深入拆解Java虚拟机

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

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

深入拆解Java虚拟机

17、即时编译(下)

今天我们来继续讲解Java虚拟机中的即时编译。 Profiling上篇提到,分层编译中的0层、2层和3层都会进行profiling,收集能够反映程序执行状态的数据。其中,最为基础的便是方法的调用次数以及循环回边的执行次数。它们被用于触发即时编译。 此...

深入拆解Java虚拟机
15758596061673