NOTE
7.12 逃逸分析
1. 逃逸分析是什么 就是分析一个对象的作用域。 逃逸有两种: - 方法逃逸:在本方法中定义的对象可以被外部方法访问 - 线程逃逸:在本线程中定义的对象可以被其他线程访问 2. 如何开启 逃逸分析的 JVM 参数如下: - 开启逃逸分析:-XX:+DoEscapeAnalysis - 关闭逃逸分析:
这是历史学习笔记,可能存在过时或不完整的理解。
1. 逃逸分析是什么
就是分析一个对象的作用域。 逃逸有两种:
- 方法逃逸:在本方法中定义的对象可以被外部方法访问
- 线程逃逸:在本线程中定义的对象可以被其他线程访问
2. 如何开启
逃逸分析的 JVM 参数如下:
- 开启逃逸分析:-XX:+DoEscapeAnalysis
- 关闭逃逸分析:-XX:-DoEscapeAnalysis
- 显示分析结果:-XX:+PrintEscapeAnalysis
逃逸分析默认是开启的
3.2. 没有逃逸的对象可以优化
3.2.1. 锁消除
没有发生线程逃逸的对象锁可以被消除掉。 例如,单线程情况下使用StringBuffer,里面的sychronized可以被消除
锁消除的 JVM 参数如下:
- 开启锁消除:-XX:+EliminateLocks
- 关闭锁消除:-XX:-EliminateLocks
锁消除在 JDK8 中都是默认开启的。
3.2.2. 标量替换
- 标量:基础类型和对象的引用
- 聚合量:对象
如果一个对象不会发生逃逸,那么可以把他分解成标量,直接在栈上分配
标量替换的 JVM 参数如下:
- 开启标量替换:-XX:+EliminateAllocations
- 关闭标量替换:-XX:-EliminateAllocations
- 显示标量替换详情:-XX:+PrintEliminateAllocations
标量替换同样在 JDK8 中都是默认开启的
3.2.3. 栈上分配
如果一个对象不会发生逃逸,那么可以把他分解成标量,直接在栈上分配。 通过标量替换实现的