由于对象本身就是逃逸或者因为方法内联不够彻底而被即时编译器当成逃逸时,即时编译器就不能进行标量替换了。这时就需要对字段访问进行优化。

    字段读取优化
    即时编译器将沿着控制流缓存字段存储、读取的值,并在接下来的字段读取操作时直接使用该缓存值。这要求生成缓存值的访问以及使用缓存值的读取之间没有方法调用、内存屏障,或者其他可能存储该字段的节点。
    遇到对同一字段的存储节点时,会更新缓存值;遇到更新节点时,如方法调用节点、内存屏障节点,会舍弃所有缓存值。
    即时编译器将在 volatile 字段访问前后插入内存屏障节点。这些内存屏障节点会阻止即时编译器将屏障之前所缓存的值用于屏障之后的读取节点之上,加锁解锁操作同理。

    字段存储优化
    消除冗余的存储节点。volatile同理。

    死代码消除
    局部变量的死存储消除以及部分死存储消除。它们可以通过转换为 Sea-of-Nodes IR 来完成。

    第二种是不可达分支。通过消除不可达分支,即时编译器可以精简数据流,并且减少编译时间以及最终生成机器码的大小。