JVM 笔记

2018/04/13 Java

逃逸分析

Java中的对象都是在堆中分配吗?说明为什么!

【逃逸分析】(Escape Analysis):Java HotSpot 虚拟机可以分析创建对象的【使用范围】,并决定是否在 Java 堆上分配内存的一种技术。

对象的逃逸状态:

  1. 全局逃逸:一个对象的作用范围逃出了当前方法或者当前线程
  • 对象是一个静态变量

  • 对象作为返回值

  1. 参数逃逸:一个对象被作为方法参数传递,或者被参数引用

  2. 没有逃逸

逃逸分析的场景

一个对象没有逃逸(即没有超出当前方法的使用范围)时,虚拟机可以做以下优化:

  1. 锁消除
  • 当前对象如果只有当前线程使用,就会移除改对象的锁
  1. 标量替换
  • 把对象的成员变量分解成分散的变量
  1. 栈上分配
  • 如果一个对象没有发生逃逸,压根就不用创建他,通过标量替换分解成成员标量,分配在栈内存中,和方法的生命周期一致,随着栈帧出栈时销毁

小结

开发时尽可能控制变量的作用范围,让虚拟机尽可能的优化内存分配。

内存分配

Search

    Table of Contents