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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓 中级黑马   /  2013-6-6 22:15  /  2062 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘晓 于 2013-6-7 16:21 编辑

毕老师一画图就说栈和堆,那到底什么样的数据放在堆里,什么样的数据放在栈里呢

评分

参与人数 1技术分 +1 收起 理由
尹丽峰 + 1 新手,多多努力,希望早日来到黑马!.

查看全部评分

6 个回复

倒序浏览
栈内存是存放局部变量的,所有的局部变量和引用变量都在栈里,而且栈内存中的数据在使用完毕会自动消失;而对内存是存放对象用的,也就是NEW出来的对象,都在堆里,不过堆内存里的数据在没有引用指向它以后,会不定时被垃圾回收机制所自动回收掉,这也是和C++的一个区别。
回复 使用道具 举报
函数的参数中定义的变量,函数中定义的变量都会在栈中开辟空间  一旦变量所在的方法被线程执行完毕之后  栈里面的对应该方法的所有变量都被自动释放掉  当你的程序里面出现new的时候  就会在堆内存中开辟空间  堆内存开辟的对象的空间 主要存放的是非静态的成员变量  当这个对象没有被其他引用指向的时候  就变成了垃圾“Garbage”  这时候  虚拟机会在不确定的时候  调用Garbage Collector(GC)垃圾回收器来清理掉这个堆内存中没有引用指向的垃圾  但是  类的静态成员变量在方法区

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
栈内存是直接从你的物理内存上被系统划分出来的一块特定区域。栈空间可以看做是系统的一个缓存内存空间,空间很小。在windows操作系统下大小是2M。因为栈的空间是连续的,程序寻址很快,所以栈里的内存读写效率是比堆要高的。栈内存由系统内核自动管理,创建时可直接由程序员申请,超出作用域后该块内存自动被标为可用内存,以便接下来新的数据再次使用。在java中所有的引用变量和基本数据类型都在栈中,因为这些类型数据量比较小,读写很频繁,所以放在是比较小的栈中不会太拥挤,同时可以提高效率。

堆内存是你电脑所有可利用内存的整合,其中包括物理内存,虚拟内存。因此堆内存是不连续的,当须要使用堆内存时系统会查找所有堆空间中一块大小够放你申请数据的地方然后拿出来用。所以堆内数据在读写的时候,都须要系统寻址比较长的时间来查找相应的位置,所以速度比栈要慢一些。但是堆的好处是很大。你所有的电脑可用内存都在堆内存的范围内。所有用new关键词建立出来的东西都是在堆中的,java中有堆内存回收机制,所以回收也是自动的,不用程序员管理。Integer num = new Integer(888);其中num是一个引用,所以他在栈空间中,而888这个数是new出来的。所以在堆中开了一块大小为4*8 =32bit的地方用来放888这个数 int num = 5;因为没使用new所以仅仅只是在栈中开了一块大小为32bit的地方放这个5,然后把这个地方的地址给了num保存。

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多出质量贴啊   这个视频里边都会又讲到的  多多看视频  
回复 使用道具 举报
Jvm在运行时把内存主要分成五个部分:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(运行时常量池)。
而我们平时所说的栈和堆主要是指java虚拟机栈,java堆
栈(线程私有):
    每个JVM的线程在创建的时候,都会创建一个栈。一个栈包含很多栈桢。栈帧用来存储局部变量表(存放了编译器的各种基本数据类型如boolean、byte、char、short、int、float、long、double;对象引用(不同虚拟机存储的不同如指向对象起始地址的引用指针或者是代表对象的句柄);returnaddress类型)、操作栈、动态链接、方法出口等信息。
  

       JVM有一个在所有线程内共享的堆。堆是给所有类的实例和数组分配内存的运行时数据区。 堆在虚拟机启动的时候创建,堆中储存的对象通过一个自动存储管理系统(垃圾回收器)进行回收。 对象从不明确的被分配(JVM从不指明对象的释放)。JVM加上没有(JVM不指定特定的自动存储管理系统)自动存储管理系统的特别的类型,(开发者可根据系统要求自主选择)并且这个存储管理技术可能被选择按照实现的系统需求。
   
回复 使用道具 举报
楼主:
1、楼上几位哥们说的都很好,我就不重复了,直接说结果了。
2、我们一般所用到的是内存中的三个部分:
    栈:存放数据型变量,int  byte  long  char float 等
        存放引用型变量,数组,对象等
    堆:存放的是对象,就是所有用关键字new出来的都放在堆里
    方法区,分两部分:
        静态区:存放的是用static修饰的。
        非静态区:存放的是非static方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马