NOTE

7.12 逃逸分析

1. 逃逸分析是什么 就是分析一个对象的作用域。 逃逸有两种: - 方法逃逸:在本方法中定义的对象可以被外部方法访问 - 线程逃逸:在本线程中定义的对象可以被其他线程访问 2. 如何开启 逃逸分析的 JVM 参数如下: - 开启逃逸分析:-XX:+DoEscapeAnalysis - 关闭逃逸分析:

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

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. 栈上分配

如果一个对象不会发生逃逸,那么可以把他分解成标量,直接在栈上分配。 通过标量替换实现的

4. 参考