小白秒懂什么是栈上分配
在JVM中,堆内存中保存对象实例和数组,但其实有些时候,对象是不在堆内存中存储的。
我们来想一个问题:如果一个方法中的对象作用域只在这个方法中,那是否还有必要把它保存在堆中。我们都知道,堆中是会有GC垃圾回收的,这种作用域只在自己的方法中的对象在我们的程序中是有很多的,那这么多的这种类型的对象都放在堆中,岂不是会白白给GC添加负担吗?
是的,确实会有这种负担。所以我们就可以引入栈上分配这个概念了。
针对上面这种问题,有一个很好的解决方案:把这种生命周期很短的对象,我们保存在栈中,方法结束栈回收,那这些对象不就一起回收了吗,就不用GC来操刀了。这种方式就叫做栈上分配。
想要开启栈上分配是有两个前提:
- 开启逃逸分析:逃逸分析的意思就是判断对象是否逃逸出这个方法的作用范围(如果逃出了,就没法进行栈上分配了)。
- 举个例子什么叫做逃逸出方法作用范围:
public Cat test(){
Cat cat = new Cat();
return cat; // 这就是一种逃逸
}
public void test() {
Cat cat = new Cat();
xx(cat); // 这也是一种逃逸
}
public void xx(Cat cat) {}
- 开启标量替换:意思就是将对象根据属性打散后,分配到栈上,默认开启。