五、编译优化技术
5.1 逃逸分析
逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术
逃逸分析的基本原理是: 分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用
- 例如作为调用参数传递到其他方法中,这种称为方法逃逸
- 甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸
- 从
不逃逸
、方法逃逸
到线程逃逸
,称为对象由低到高的不同逃逸程度。
关于逃逸的优化:
- 栈上分配: 如果
确定一个对象不会逃逸出线程之外
,那让这个对象在栈上分配内存将会是一个很不错的主意。即可以让这个对象随栈的弹出而释放,栈上分配可以减轻Java堆垃圾回收的压力 - 标量替换:
- 若一个数据已经无法再分解成更小的数据来表示了,Java虚拟机中的原始数据类型(int、long等数值类型及reference类型等)都不能再进一步分解了,那么这些数据 就可以被称为标量
- 如果可再分就被称为聚合量
- 把一个Java对象拆散,根据程序访问的情况,将其用到的成员变量恢复为原始类型 来访问,这个过程就称为标量替换
- 同步消除: 线程同步本身是一个相对耗时的过程,如果逃逸分析
能够确定一个变量不会逃逸出线程
,无法被其他线程访问,那么这个变量的读写肯定就不会有竞争, 对这个变量实施的同步措施也就可以安全地消除掉
。
六、高效并发
6.1 Java内存模型与线程模型
Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节
JMM规定:
- 所有变量都存储在主内存中(Main Memory)中。主内存主要对应于Java堆中对象实例数据部分
- 每条线程都有自己的工作内存(Working Memory),工作内存中保存该线程使用的变量关于主内存的副本拷贝 。工作内存对应于虚拟机栈中的部分区域
- 线程对变量所有操作都必须在工作内存中进行,不能直接读写主内存的变量
内存直接的交互:八大操作
- lock (锁定):作用于主内存的变量,把一个变量标识为线程独占状态
- unlock (解