1 Java对象在堆中分配内存是否绝对
- Java中对象一般在堆中分配内存,但是存在特殊情况:如果经过逃逸分析之后发现,对象并没有逃逸出方法的话,就可能被优化成栈上分配内存
- 优点:栈中分配内存,随着方法的执行结束,栈空间被自动移除,无须进行垃圾回收,减少了GC压力
2 逃逸分析
- 分析对象的动态作用域
- 当一个对象在方法中被定义后,只在方法内部使用,认为没有发生逃逸;当一个对象在方法中被定义后,被外部方法锁引用,认为发生逃逸。对于没有发生逃逸的对象,考虑栈上分配内存
//返回的是StringBuffer类型的对象,可能会被其他方法继续使用,发生逃逸
public stringBuffer append(String apple,String pear){
StringBuffer buffer=new StringBuffer();
buffer.append(apple);
buffer.append(pear);
return buffer;
}
// 返回的是字符串,对象值作用在方法内,随着方法执行的结束,对象就结束了,没有发生逃逸
public string append(String apple,String pear){
StringBuffer buffer=new StringBuffer();
buffer.append(apple);
buffer.append(pear);
return buffer.toString();
}
3 在逃逸分析时,编译器做了哪些优化?
class User{
public int id;
public String name;
}
//标量替换:把u1对象拆成两个标量1和Tom存储在栈中
public void create(){
User u1 = new User;
u1.id = 1;
u1.name = "Tom";
}