黑马程序员技术交流社区

标题: 关于堆与栈的区别 [打印本页]

作者: 橡皮-leo    时间: 2014-3-27 20:12
标题: 关于堆与栈的区别
在声明变量,建立对象时什么时候在堆内存什么时候在栈内存?
作者: ___________゛M    时间: 2014-3-27 20:34
基本的数据类型会在栈里面存放 , 引用类型是在堆里面存放的。 也就是要new 的类型。 栈里面存放的只是这个引用类型的变量名称 。
作者: Style栉    时间: 2014-3-27 20:58
基本数据类型在栈中存放.引用类型在堆中.
作者: 探花    时间: 2014-3-27 22:38
JVM中会有栈内存,和堆内存和方法区,当定义了常量等基本数据类型都在栈内存中,main主函数也在栈内存,引用类型或具体方法在堆内存中,
例如 :
Person  p  =  new Person ();
此处 P就在栈内存中一片空间,
而new Person 就会在堆内存中开辟一片空间。
而 在栈中会记录 方法的 首地址
如下图



作者: Maple_枫    时间: 2014-3-28 16:55
栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。

堆内存:通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。

引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2