黑马程序员技术交流社区
标题:
栈内存与对内存的区别?——已解决
[打印本页]
作者:
王璐
时间:
2012-6-12 09:04
标题:
栈内存与对内存的区别?——已解决
本帖最后由 王璐 于 2012-6-15 08:25 编辑
栈内存与对内存的有什么区别,哪里有讲它们的视频?
作者:
黑马—陈磊
时间:
2012-6-12 09:13
本帖最后由 黑马—陈磊 于 2012-6-12 09:34 编辑
贴一个;
堆和栈的区别如下:
堆很灵活,但是不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的 NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。
栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。
总之,就是变量和对象的引用存储在栈区中,而对象在存储在堆中。
作者:
黑马-王言龙
时间:
2012-6-12 09:17
具说这个问题可以百度{:3_59:}
作者:
郑冬
时间:
2012-6-12 09:17
毕老师的基础视频里就讲过!
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不在被使用,会在不确定的时间内被垃圾回收器回收
作者:
孙新强
时间:
2012-6-12 09:18
栈内存(stack):存放基本类型的数据和对象的引用,即存放变量。
如果存放的事基本类型的数据(非静态变量),则直接将变量名和值存入stack中的内存中;
如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)。
堆内存:存放new产生的数据。
希望对你能有帮助。另外,再发给你一个网址:http://www.2cto.com/kf/201109/102699.html
作者:
刘笑
时间:
2012-6-12 09:21
栈与堆都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
最后,栈是存放函数调用过程中的临时变量的! 堆是程序运行过程中动态申请的内存的存放处的!比如new的对象就在堆上
作者:
逝去的记忆ヽ
时间:
2012-6-12 09:26
1 、栈区( stack )— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.
2 、堆区( heap )— 亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存.但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.
3 、全局区(静态区)( static )— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由有系统释放.
4 、常量区 — 常量字符串就是放在这里的.程序结束后由系统释放.
5 、程序代码区 — 存放函数体的二进制代码.
打个比方:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
作者:
余清兰
时间:
2012-6-12 09:30
内存结构
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存(栈区):
用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存(堆区):
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值(本节即指数组地址)。
实体中的变量在没有赋值的情况下都有默认初始化值。默认值是根据数组中元素的类型而定,若是int型数组 ,默认值是0。若是double型数组,默认值是0.0,若是float型数组,默认值是0.0f,若是boolean型数组,默认值是false,若是char型数组,默认值是\u0000即是一个空位,相当于空格,若是String类型,默认值是null。如果想给堆内存中的一个实体0角标赋值,格式为x[0]=10;
实体不再被使用,会在不确定的时间内被垃圾回收器回收(java虚拟机的回收机制)。
作者:
王广丛
时间:
2012-6-12 11:26
我个人猜测楼主是想了解有关java中对象的存储问题,你可以看一下我写的这个文章,http://www.rolfwang.com/technology/259.html
希望能对你有用,另外希望能给加技术分,正在急需技术分参加考试
作者:
孙浩迪
时间:
2012-6-12 12:58
java把内存划分成两种,一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new 创建的对象和数组。在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理,在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来该问堆中的数组和对象。
希望对你有帮助 。
作者:
涂金哲
时间:
2012-6-12 15:12
堆栈。常规RAM(随机访问存储器)区域。堆栈指针下移,会创建新的内存;若上移,则释放内存。由于直接操作指针所以是一种特别快、效率高的数据保存方式。编译器必须知道堆栈内存中保存数据的“长度”和“存在时间”以便移动指针。所以,虽然堆栈中可以存储java数据特别是对象引用,但是java对象并不存储与堆栈中。 堆。通用内存池,编译器不需要知道堆内存中的数据的存在时间,所以java的对象存储在堆中。用new关键字创建一个对象,当执行时会自动在堆里进行存储分配。只是在堆中进行存储分配、清理所需时间比堆栈要多。程序中常用的基本类型数据比较特殊,由于new将数据存在堆里,若创建一些比较小的、简单的变量就会占用较多的资源,效率会受到影响,因此java的基本类型数据对象并不是引用的自动变量,而是以值来存储于堆栈中,这样便可获得更高的效率. 如果我们创建了一个对象 Student st=new Student(),此时系统会在栈内存中分配st的存储空间,并在堆内存分配空间存储new关键字创建的对象,并且默认初始化为null。 在方法、循环结构中声明的变量由于确定了变量的作用域和生命期,所以存储在栈内存中,这样当方法结束,作用域结束,系统可释放资源,优化了内存的管理。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2