黑马程序员技术交流社区

标题: 关于栈和堆的问题 [打印本页]

作者: 奋斗的小雨    时间: 2014-1-20 14:21
标题: 关于栈和堆的问题
本帖最后由 奋斗的小雨 于 2014-1-20 16:17 编辑

栈和堆区别我只稍微弄明白了点,就是一个临时存放数据,一个可以一直存着。其它理解不了
作者: 月生春    时间: 2014-1-20 14:27
简单的说:
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,
当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,
该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第
3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

作者: 透过生活    时间: 2014-1-20 14:35
本帖最后由 透过生活 于 2014-1-20 14:38 编辑

Java把内存划分成两种:一种是栈内存,一种是堆内存。   
    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。  
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
作者: 廉伟杰    时间: 2014-1-20 14:40
栈是由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等,如定义int a;a就在栈区里面,而堆的话是在内存中开辟空间得到,如new 类名(),数组,这中在内存中不用时,需自己释放或者系统释放       我觉得这个例子可以很好的解释   Person p = new Person();
这里的 p就是在栈内存中的,而new Person()在堆内存中开辟,包括这个对象的字段和方法,堆内存中每一个存放的一堆有一个地址,而把这个地址赋给了p
如图

QQ截图20140120143947.png (71.52 KB, 下载次数: 24)

QQ截图20140120143947.png

作者: 路国强    时间: 2014-1-20 14:57
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理方式和内存管理方式。栈内存、堆内存、方法区、本地方法区、寄存器。
栈内存:用于存储局部变量,当数据用完,所占空间会自动释放。
堆内存:存放数组和对象,通过new建立的实例都存放在堆内存中。实体不在被使用时,会在不定期的时间内被垃圾回收器回收。
作者: 奋斗的小雨    时间: 2014-1-20 16:17
月生春 发表于 2014-1-20 14:27
简单的说:
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象 ...

非常感谢,现在弄清楚了。
作者: 奋斗的小雨    时间: 2014-1-20 16:18
廉伟杰 发表于 2014-1-20 14:40
栈是由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等,如定义int a;a就在栈区里面, ...

非常感谢,现在弄清楚了。




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