您的位置:首页 > 编程语言 > Java开发

在java中对象的生存空间堆(heap) 和方法的调用和的生存空间 栈(stack)

2007-12-26 11:32 337 查看
在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实例 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐