A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 橡皮-leo 中级黑马   /  2014-3-27 20:12  /  1309 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在声明变量,建立对象时什么时候在堆内存什么时候在栈内存?

4 个回复

正序浏览
栈内存:某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈。当函数运行结束时,分配给函数的栈空间被收回,在这个函数中被定义的变量也随之被释放和消失。

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

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
JVM中会有栈内存,和堆内存和方法区,当定义了常量等基本数据类型都在栈内存中,main主函数也在栈内存,引用类型或具体方法在堆内存中,
例如 :
Person  p  =  new Person ();
此处 P就在栈内存中一片空间,
而new Person 就会在堆内存中开辟一片空间。
而 在栈中会记录 方法的 首地址
如下图


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
基本数据类型在栈中存放.引用类型在堆中.
回复 使用道具 举报
基本的数据类型会在栈里面存放 , 引用类型是在堆里面存放的。 也就是要new 的类型。 栈里面存放的只是这个引用类型的变量名称 。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马