黑马程序员技术交流社区

标题: 什么是堆,什么是栈? [打印本页]

作者: 高顺德    时间: 2013-3-26 23:51
标题: 什么是堆,什么是栈?
本帖最后由 天下 于 2013-3-27 12:11 编辑

为什么用的存放在堆?有的存放在栈?这个有什么不同的吗?static 属性 方法 都是放在哪里的?
作者: 孙百鑫    时间: 2013-3-26 23:58
两个内存是不同的...比如int x=1,就是临时变量会再栈内存中.  而建立对象比如Demo d=new Demo();这个就是咱堆内存中了
作者: 黑马19我最牛    时间: 2013-3-27 00:02
栈内存 和堆内存,是内存中的两个区域,栈内存中的方法和数据在使用完后会自动释放,但是堆内存中的不能自动释放,必须要JAVA虚拟机的垃圾回收机制来回收才能释放!
作者: 杨明宁    时间: 2013-3-27 00:03
栈内存:
  存储的是局部变量,for中的,函数中的
  栈内存还运行函数,函数运行的时候,是在栈内存中运行的
  特点:存储的变量,必须手动赋值
        无论局部变量,还是函数,运行完成后,就释放了,出去了

堆内存:
  存储的是,容器实体,new 建立的容器,存储在堆内存中,全局变量
  特点,存储进来的,不能自动释放,需要JVM启动垃圾回收机制,清除
        堆内存中,存储的数据,都有默认值...int 0 double 0.0  boolean false String null  char \u....每一个实体都有内存地址值
作者: 罗胜华    时间: 2013-3-27 02:30
可以这么简单的给你介绍下堆和栈的区别:

栈内存:所有基本数据类型的值都是存在栈内存中   比如: int num = 10,那么栈内存开辟一个空间给num,并让num初始化为10
            栈内存中还会存一些引用,比如说String s = "abc"; 那么此时在栈内存开辟一个空间给 s 变量,但是字符串真正的内容abc是存在堆内存中,这个要明白。s 只是一个地址指向真正的字符串对象

堆内存: 堆内存一般都存储引用数据类型,比如说:字符串,类的实例:(new Person())
   Person p = new Person();
p是存在栈内存  而new Person()是存在堆内存, p------->new Person();
这样讲你能明白吗?


作者: 蔡陶军    时间: 2013-3-27 03:15
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些
堆(数据结构):堆可以被看成是一棵树,如:堆排序
栈(数据结构):一种后进先出的的数据结构
作者: 芦子骐    时间: 2013-3-27 11:29
对于栈内存:是跟CPU交互最快的地方,一般栈内存中存放的都是一些引用变量,比如说你int[] a = {1,2,3,4}; 栈内存中村的只是一个a的地址值,因为栈内存空间是比较小的。
对于堆内存:主要是存储对象,你new出一个对象的时候,栈内存中存了地址值,指向堆内存中的对象空间。
这就是栈和堆的基本区别。
作者: 高顺德    时间: 2013-3-27 12:09
杨明宁 发表于 2013-3-27 00:03
栈内存:
  存储的是局部变量,for中的,函数中的
  栈内存还运行函数,函数运行的时候,是在栈内存中运行的 ...

static 属性 方法 都是放在哪里的?
作者: 高顺德    时间: 2013-3-27 12:11
static 属性 方法 都是放在哪里的?
作者: 杨明宁    时间: 2013-3-27 15:20
高顺德 发表于 2013-3-27 12:09
static 属性 方法 都是放在哪里的?

没明白你要表达的问题,可以问得具体点吗?
作者: 赵喜平    时间: 2013-3-27 15:59
Java把内存划分成两种:一种是栈内存,一种是堆内存。
heap堆:用来存放new出来的东西
stack栈:局部变量。
static变量存放在data sagment




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