堆与栈

来源:互联网 发布:多媒体网络教学系统 编辑:程序博客网 时间:2024/06/06 05:49

在Java中,有两种区域需要程序员注意,即对象的生存空间堆(Heap)与方法调用及变量的生存空间栈(stack)。当Java虚拟机启动时,会从底层的操作系统取得一块内存,并以此区段来执行Java查询。至于会得到多大的内存,以及是否能够调整内存大小取决于Java虚拟机与平台的版本。

1.所有的对象都存在于可以垃圾回收的堆上,而变量存在于哪一个空间则取决于它是哪一种变量。
2.实例变量声明在类而不是方法中,它们代表每个独立对象的”字段”,存在于所属的对象中,即存在于堆内存。
3.局部变量和方法的参数都是声明在方法中,它们是暂时的,且生命周期只限于方法被放在栈内存上的这段时间(也就是方法调用至执行完毕为止)。所有局部变量都存在于栈上相对应的堆栈块中。
4.对象引用变量与primitive主数据类型变量都是放在栈上。

这里写图片描述

方法会被堆在一起,当你调用一个方法时,该方法会被放在调用栈的栈顶。实际被堆上栈的是堆栈块,它带有方法的状态,包括执行到哪一行程序以及所有的局部变量的值。
栈顶上的方法是目前正在执行的方法。

public void doWork(){
boolean flag = true;
write(3);
}

public void write(int x){
int y = x++;
sleep();
}

public void sleep(){
System.out.println(“I’m sleeping…”);
}

分析:
1.某段程序代码调用了doWork()方法,使得该方法被放在stack栈顶。
2.doWork()又调用了write(),则write()就放在栈顶。
3.write()又去调用sleep(),则sleep()处于栈顶。
4.当sleep()方法执行完后,它的堆栈块就会被释放掉,执行就回到了write()方法。
这里写图片描述

注:
当要创建一个对象时,Java必须在堆上帮助这个对象找一个位置。那么需要多大空间呢?足以存放对象所有实例变量的空间。对象的实例变量的值存放在改对象中,如果实例变量全部是primitive主数据类型,则Java会依据primitive主数据类型的大小为该实例变量留下控件。int需要32位….

但是如果实例变量是对象类型?
如果有声明变量但是没有给它赋值,则只会留下变量的空间。
知道该变量被赋值及初始化,才会在堆上占有空间。

这里写图片描述

0 0
原创粉丝点击