1.6 KiB
1.6 KiB
方法内联
编译器最重要的优化手段, 业内称为优化之母, 除了消除方法调用的成本外,为其它优化手段建立良好的基础
逃逸分析
分析对象动态作用域, 当一个对象在方法里面被定义后,它可能被外部方法所引用, 例如被作为调用参数传递到其它方法中,称为"方法逃逸"; 甚至还可能被外部线程访问到, 譬如赋值给可以在其他线程中访问的实例变量,称为"线程逃逸"
如果能证明一个对象不会逃逸到方法或线程外,或逃逸程度较低,可能为这个对象实例采取不同程度的优化,如:
- 栈上分配 确认一个对象不会逃逸出线程外, 可以让该对象在栈上分配内存, 对象所占的内存空间可以随栈帧出栈销毁, 支持方法逃逸,不支持线程逃逸
- 标量替换 若一个数据无法分解为更小的数据表示, 原始数据类型都不能再进一步分解, 这些数据可以分解为标量。 如果一个数据可以继续分解,它被称为聚合量, 把一个 Java 对象拆散,根据程序访问的情况,将其用到的成员变量恢复为原始类型访问,称为"标量替换", 该方法不允许对象逃逸出方法范围内
- 同步消除 如果确定一个变量不会逃逸出线程,无法被其他线程访问, 对这个变量实施的同步措施可以消除掉
公共子表达式消除
如果一个表达式 E 之前就被计算过了, 并且从先前的计算到现在 E 的值都内有发生变化, 那么 E 这次出现称为公共子表达式