栈与堆:生存空间

在Java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间栈(stack)。当Java虚拟机启动时,它会从底层的操作系统取得一块内存,以及你是否能够调整它都要看Java虚拟机与平台的版本而定。但通常你对这些事情无法加以控制。

[b]所有的对象都存活于可垃圾回收的堆上,方法调用在栈中执行,局部变量存活于栈中。[/b]

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

局部变量和方法的参数都是被声明在方法中。它们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。如果局部变量时基本数据类型,变量放在栈上;如果局部变量是个引用变量,变量本身会放在栈上,该变量引用的对象会在堆上。
例如:

public class B(){}
public class A{
public void a(){
int i = 1;
b();
}
public void b(){
B b = new B();
}
}


[img]http://dl.iteye.com/upload/attachment/307281/0fd1ef04-88b4-3642-baf8-4e8d0ceaf689.jpg[/img]

实例变量是被声明在类而不是方法里面。它们代表每个独立对象的“字段”(每个实例都能有不同的值)。[b]实例变量存在于对象所属的堆空间上[/b]。如果实例变量是基本数据类型的,则Java会依据基本数据类型的大小为该实例变量留下空间(位于对象所属的堆空间上),例如int型需要32位;如果实例变量是引用类型时,Java会为该引用变量留下空间(位于对象所属的堆空间上),并且另外为该[b]引用变量指向的对象[/b]再分配一块堆空间(前提是其中的对象已初始化),最终引用变量与其所引用的对象都是在堆上。

例如:
public class B{
int i = 1;
}
public class A{
int a = 1;
long l = 12456;
B b = new B();
}


[img]http://dl.iteye.com/upload/attachment/307286/07bf5d23-cc78-3f1b-98a5-816dfe73d47d.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值