Java把内存分为两种:堆内存和栈内存
在函数的定义中一些基本
类型的变量
和
对象引用变量
都是在函数的
栈内存
分配;
当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后java会自动释放掉该变量分配的内存空间,该内存空间可以立刻另做他用。
堆内存用于存放由
new创建的对象和数组。
在堆中分配的内存,由java虚拟机自动垃圾回收机器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名。
数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍占着内存,在随后一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。
堆主要来存放对象,栈主要用来执行程序。