首先回顾一下jvm内存分配策略:
java虚拟机所管理的内存包括:方法区、虚拟机栈、本地方法栈、推、程序计数器等
JVM运行时数据主要存放在堆和栈,此处栈指虚拟机栈。
栈中存放了一下基本类型,及对象的引用。堆中主要存放对象,既new关键字创建的对象或数组元素等等。
但是由于JIT编辑和逃逸分析的影响,对象存在堆中不一定是绝对的。
发生逃逸行为分为两种:
1.线程逃逸:如类变量或实例变量,可以被其他线程访问到
2.方法逃逸:当一个对象在方法中定义之后,作为参数传递到其他方法中
如果不存在逃逸行为,则可以对该对象进行如下优化:同步消除、标量替换、栈上分配。
同步消除:如果确定对象不会被其他线程访问到,其读写没有竞争,则可以取消其同步锁。
标量替换:如果确定对象不会被外部访问(线程活其他方法),那该对象可能被拆散,经过优化之后不直接生成该对象,而是在栈上创建若干个对象中的成员变量。
栈上分配:HotSpot虚拟机并没有真正意义实现栈上分配,实际上还是标量替换。
这样可以避免创建大量对象,减少GC压力,一定程度上也可能提高运行效率。