对象分配流程图
对象栈上分配
我们通过jvm内存分配可以了解到对象都是在堆上分配的,如果对象没有被使用了会由GC进行回收,如果垃圾对象比较多那么会给GC的回收带来较大的压力,间接影响了应用的性能,为了减少临时对象在堆上分配的数量,JVM会通过逃逸分析来确定对象会不会被外部引用,如果不会逃逸则会将对象在栈上分配内存,这样该对象所占用的内存空间会随着栈针的出栈而销毁,减轻了GC回收的压力
逃逸分析
就是分析对象的作用域当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中。
public User escape1() {
User user = new User();
user.setId(1);
user.setName("jackandpig");
//TODO 保存到数据库
return user;
}
public void escape2() {
User user = new User();
user.setId(1);
user.setName("jackandpig");
//TODO 保存到数据库
}
从上面可以看出escape1方法中的user对象被返回了,这个对象的作用域范围不确定,escape2方法中的user对象我们可以确定当方法结束这个对象就可以认为是无效对象了,像escape2里面的user对象我们可以将它分配在栈