Java中的堆与栈——变量和对象的生存空间

###Java中的堆与栈——变量和对象的生存空间

内存中有两个程序员需要注意的区域:

  • 对象的生存空间——堆(heap)
  • 方法调用及变量的生存空间——栈(steak)

变量用不同的维度看待有不同的叫法。

当一些变量们被声明在类中时,它们代表每个独立对象的“字段”,他们被称为实例变量。实例变量存在于所属的对象中。

区域变量也被称作栈变量,表示该变量是局部变量还是实例变量。

局部变量和方法的参数都是被声明在方法中。他们是暂时的,且生命周期只限于方法被放在栈上的这段期间(也就是方法调用至执行完毕为止)。

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

对象存在于堆中,不论对象是否声明或创建。如果局部变量是个对该对象的引用,只有变量本身会放在栈上。对象本身只会在堆上。

无论是实例变量还是局部变量,只要是对象都会在堆上。

当要新建一个对象时,Java必须在堆上帮对象找一个位置。至于需要多少空间取决于该对象多有实例变量的空间。实例变量存在于对象所属的堆空间上。

对象的实例变量是存放于该对象中的。如果实例全部都是基本数据类型,则Java会依据变量空间大小开辟空间。如果实例变量是个对象,则会保存其引用的值而不是对象本身。如果只声明而没有赋值,则会只留下变量的空间。直到引用变量被赋值一个新的对象,这个引用的对象才会在堆上占有空间。