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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张开开 黑马帝   /  2012-1-14 20:56  /  2903 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问,堆内存和栈内存有哪些区别啊??

9 个回复

倒序浏览
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配,堆内存用来存放由new创建的对象和数组

评分

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

查看全部评分

回复 使用道具 举报
一般栈被用作活动记录,即每一个作用域的活动参数都记录在其中,例如一个函数的调用,它的栈空间就会存放调用者的地址、返回值、保存的机器状态(用于返回)、局部变量和临时变量。
而堆是全局的,存放的是对象的实例,在栈中存放的变量是存放了堆中的实例地址,所以我们传值的时候都是传引用,即地址,所以一个对象可以在嵌套作用域中仍指向同一个实例

评分

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

查看全部评分

回复 使用道具 举报
概括一下上楼的回答:栈用来存放变量,堆用来存放New出来的对象。
仅供参考。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 张伟~ 于 2012-1-31 09:56 编辑

     当一个方法执行时,每个方法都会建立自己的内存栈,方法中定义的变量则会放回这块栈内存中。 随着方法的执行结束,这个方法的内存栈也将自然销毁。
因此,所有方法中定义的变量都是放在栈内存中得。
   而当我们在程序中创建一个对象时,这个对象将会保存到运行时数据区中,以便反复利用(因为对象的创建成本 通常较大),这个运行时数据区就是堆内存了。
堆内存中得对象不会随方法的结束而销毁,因为即便方法结束后,这个对象还可能被另一个引用变量所引用。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时间回收它。

评分

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

查看全部评分

回复 使用道具 举报
局部变量放栈内存中,凡是new出来的东西都放堆内存中
回复 使用道具 举报
曾辉 黑马帝 2012-1-17 14:19:18
7#
栈是存放函数调用过程中的临时变量的! 堆是程序运行过程中动态申请的内存的存放处的!比如new的对象就在堆上
程序内存的动态改变部分可以分成两个区:
堆栈(stack):内存总是向一个方向增加或向相反方向减少,这个内存区用于存放方法或块中声明的局部变量。遇到局部变量声明时(包括调用方法中的变元变量-通C中的形参)内存增长,退出方法或块时这些变量弹出堆栈。
堆(heap):用于存储对象,对象的引用放在堆栈区,但是对象的数据区必须存放在堆中。堆是内存单元构成的一个巨大的表。New语句生成新对象时,保留的小块内存单元随时进行分配,一个内存单元块不再被现有变量引用时,这些不用的单元被释放和收集起来。

堆内存存放的有:String、基本数据类型、对象引用、static静态代码块等
栈内存存放的有:StringBuffer、对象等

评分

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

查看全部评分

回复 使用道具 举报
以下都是看视频后总结的

堆内存: 堆内存用来存放由new创建的对象和数组, 都存放对象的
栈内存:  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配,     简单说就是装变量的

另外,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理, 而当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间

评分

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

查看全部评分

回复 使用道具 举报
史龙贤 黑马帝 2012-1-18 23:23:20
9#
通俗一点吧,堆,就是一个垃圾桶,你吃饱了撑着非要把它弄穿了,自然,你扔进去的垃圾先落到了地上。
栈,也是个垃圾桶,底没破,好好的,所以,扔进去的垃圾,最后才落地。
栈,底没破,自然能起到垃圾桶的作用,所以转运垃圾的速度快。
堆,破了,等于没用,还得把底修好,这样才是垃圾桶,才能转运垃圾。
栈中的垃圾,一次只能装一桶那么多,只有等处理完了,才能处理下一桶。
堆,没底的,垃圾可以放在地上,形成一堆一堆,可以不固定。

不知道我这样理解对不对,虽然非常勉强而已了。不对的使劲批评。

评分

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

查看全部评分

回复 使用道具 举报
栈内存属于相对于堆内存而言更重要而且更加的宝贵,首先程序运行必然会有变量···加载到栈内存,由于其重要性,每次用完某个变量就会从栈中把该变量弹出去;而堆内存虽然是这样,但是相对而言不是特别重要,尤其是在创建对象的时候才会体现出它的作用。当然栈内存和堆内存必然有联系。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马