博学之,审问之,慎思之,明辨之,笃行之!

导航

2021年9月22日 #

23 - 逃逸分析

摘要: 我们知道,Java 中Iterable对象的 foreach 循环遍历是一个语法糖,Java 编译器会将该语法糖编译为调用Iterable对象的iterator方法,并用所返回的Iterator对象的hasNext以及next方法,来完成遍历。 public void forEach(ArrayLi 阅读全文

posted @ 2021-09-22 14:15 PP杰 阅读(82) 评论(0) 推荐(0) 编辑

22 - HotSpot虚拟机的intrinsic

摘要: 前不久,有同学问我,String.indexOf方法和自己实现的indexOf方法在字节码层面上差不多,为什么执行效率却有天壤之别呢?今天我们就来看一看。 为了解答这个问题,我们来读一下String.indexOf方法的源代码(上面的代码截取自 Java 10.0.2)。 在 Java 9 之前,字 阅读全文

posted @ 2021-09-22 14:14 PP杰 阅读(204) 评论(0) 推荐(1) 编辑

21 - 方法内联(下)

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

posted @ 2021-09-22 14:12 PP杰 阅读(89) 评论(0) 推荐(0) 编辑

20 - 方法内联(上)

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

posted @ 2021-09-22 14:11 PP杰 阅读(193) 评论(0) 推荐(0) 编辑

19 - Java字节码(基础篇)

摘要: 在前面的篇章中,有不少同学反馈对 Java 字节码并不是特别熟悉。那么今天我便来系统性地介绍一遍 Java 字节码。 "操作数栈" "局部变量区" "Java 字节码简介" "总结与实践" 操作数栈 我们知道,Java 字节码是 Java 虚拟机所使用的指令集。因此,它与 Java 虚拟机基于栈的计 阅读全文

posted @ 2021-09-22 14:10 PP杰 阅读(377) 评论(0) 推荐(0) 编辑

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

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

posted @ 2021-09-22 14:10 PP杰 阅读(206) 评论(0) 推荐(0) 编辑