----------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
Java中的 栈内存 与 堆内存:
栈内存
在函数中定义的一些(基本类型的变量)和(对象的引用变量)都是在(函数) 的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。在函数所申请的空间中给变量分配。堆内存:堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象 之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量, 定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
区别:· 栈内存主要存放类中的成员与变量 ; 堆内存主要存放由 new 创建的对象和数组。
· 栈内存中的变量,其作用域之外不再存在,并自动释放该变量的内存空间 ; 堆内存中的对象,由垃圾回收器来回收,即使不在该对象的作用域 内, 该对象仍然占用着堆内存空间,在没有被引用的时候,也不会被释放,直到被回收。这就是内存泄露的原因之一。
· 功能上的区别:栈主要用来执行程序,而堆主要用来存储对象。
联系:栈内存中的变量,存储的引用变量,可以引用堆内存中的对象。其实就是指针,并存储着堆内存中的对象的首地址。引用变量就相当于是为数组或
对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
堆栈(stack):内存总是向一个方向增加或向相反方向减少,这个内存区用于存放方法或块中声明的局部变量。遇到局部变量声明时(包括调用方法中的 变元变量-通C中的形参)内存增长,退出方法或块时这些变量弹出堆栈。
堆(heap):用于存储对象,对象的引用放在堆栈区,但是对象的数据区必须存放在堆中。堆是内存单元构成的一个巨大的表。New语句生成新对象时,保留的小块内存单元随时进行分配,一个内存单元块不再被现有变量引用时,这些不用的单元被释放和收集起来。
堆内存存放的有:String、基本数据类型、对象引用、static静态代码块等
栈内存存放的有:StringBuffer、对象等
---------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------