在java中对象的生存空间堆(heap) 和方法的调用和的生存空间 栈(stack)
java虚拟机启动会从底层的操作系统中分得一块内存
实例变量是被声明在类里面而不是在方法里面。实例变量存在与所属的对象中
局部变量和方法的参数都是声明在方法中,他们是暂时的,声明周期值限于方法放在栈上的这段期间
public class Monster {
int i;//
public boolean frighten(int d){
double x;
System.out.print("a");
return true;
}
}
关于Java栈与堆的思考 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=306181
介绍了栈与堆 的区别
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,
堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
缺点是,由于要在运行时动态分配内存,存取速度较慢。
当调用一个方法的时候,该方法会放在调用栈的栈顶。实际被推上去的是推栈块,
它带有方法的状态,包括执行到那一行以及所有局部变量的值
stack的情境
//1 doStuff()放在stack最上面的栈块中
public void doStuff(){
boolean b=true;
go(4);//2 doStuff()调用go(),go()就被放在栈顶中
}
public void go(int x){
int z=x+24;
crazy();//3 go()调用crazy(),crazy()就被放在栈顶中
int i=3;
}
public void crazy(){
char c='a';//4 crazy()执行完成后它的栈块就释放掉了,回到go()
}
如果局部变量是个引用,只有变量(遥控器)会放在栈上面,对象本身还是会放在堆上面
实例变量 (instance variable):
如果实例变量是原数据类型的java会根据大小预留下值
如果实例变量是对象
private Monster a; //只会留下空间给变量(遥控器)a
private Monster a=new Monster(); //留下空间给变量(遥控器)a 并在堆上面生成一个Monser实例