小白秒懂什么是栈上分配

小白秒懂什么是栈上分配

在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) {} 

  • 开启标量替换:意思就是将对象根据属性打散后,分配到栈上,默认开启。

你可能感兴趣的:(jvm,java)