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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成吉思汗 中级黑马   /  2013-2-21 18:39  /  1792 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请教各位栈内存和堆内存的区别是什么?
求解,谢谢。

4 个回复

倒序浏览
本帖最后由 黑马刘杰 于 2013-2-21 19:23 编辑

Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

评分

参与人数 1黑马币 +9 收起 理由
陈丽莉 + 9 技术分快二十啦,加油~

查看全部评分

回复 使用道具 举报
栈内存:局部变量。
堆内存:数组,new 出来的实体。

评分

参与人数 1黑马币 +6 收起 理由
陈丽莉 + 6

查看全部评分

回复 使用道具 举报
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
比如:Person p = new Person(); p存放在栈里面,而new Person存放在堆内存里
堆:存放所有new出来的对象。
引用变量是普通变量,定义时所在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象本身占用的堆内存也不会被释放。数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存, 在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 鼓励一下~

查看全部评分

回复 使用道具 举报
java变量存储
   1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
     2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
   3. 堆:存放所有new出来的对象。 (非对象引用)
   4. 静态域:存放静态成员(static定义的)
   5. 常量池:存放字符串常量和基本类型常量(public static final)。
   6,非ram: 存活在程序之外的数据
   对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。
   局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马