在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实例
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实例
相关文章推荐
- java第七周实验封装一类对象English,该类对象具有一种功能printEnglish输出英文字母表。再封装一类对象Greek,该类必须是English的子类,该类对象不仅可以调用方法printE
- [Java] - 通过反射调用对象的方法
- Flex一个RemoteObject调用JAVA对象里面的多个方法(转)
- 今天发现c#中的实例后的对象是不能调用静态方法,以前学Java的时候是可以的.
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
- 两种php调用Java对象的方法
- Java_内存分区堆(heap) 栈(stack)和方法区(method)
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- Java里的堆(heap)栈(stack)和方法区(method)
- 【转】Java里的堆(heap)栈(stack)和方法区(method)
- Java里的堆(heap)栈(stack)和方法区(method)
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space(Java堆空间内存溢出)解决方法
- 关于java调用对象,方法的注意事项
- java中远程对象方法调用中的安全策略问题
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- Java里的堆(heap)栈(stack)和方法区(method)
- 关于java方法调用时产生的StackFrame内部内容。
- Java的反射机制---动态调用对象的简单方法
- 用jni API 访问java对象的属性,方法,调用构造器