黑马程序员技术交流社区
标题:
想问一下关于内存怎么划分
[打印本页]
作者:
小路飞
时间:
2013-2-19 12:02
标题:
想问一下关于内存怎么划分
本帖最后由 侯国奇 于 2013-2-20 13:01 编辑
之前看的马老师的视频教程说的是内存分为堆(heap)、栈(stack)、数据区(data segment)、代码区(code segment)。
现在毕老师说的又是内存分为堆、栈、方法区、本地方法区、寄存器。
请问各位大侠这是怎么回事?
作者:
张晋瑜
时间:
2013-2-19 12:47
额,有点深奥啊
作者:
张晋瑜
时间:
2013-2-19 12:50
对于不同语言来说划分不同
一. 在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要
作者:
黄玉昆
时间:
2013-2-19 14:55
其实,你现在如果刚入门,就不要研究的那么深入,很多知识不是一下子就能都学进去的,是需要日积月累,融会贯通的。等你学的多了,你自然会有需求了解这方面的知识的。当然,如果你特别想知道,特别想了解关于内存的知识,你可以看看这篇文章,是比较详细的:http://www.iteye.com/topic/802573
简单来说:
java内存分配有如下五个区域:栈内存,堆内存,方法区,寄存器,本地方法区。
1、栈内存:存放引用数据类型和基本数据类型。引用数据类型的值基本都是堆内存中的地址值(这涉及到赋值操作)。
2、堆内存:存放创建的数组和对象的数据,存放的是那些实例。特殊的是,数组的引用也存放在这里(多维数组),可以看看关于数组的知识。
3、方法区:有静态方法区(static修饰的方法),非静态方法区(this、super都在这里),常量池(constant pool,含有字符串池StringPool等等)--存放常量(final修饰的数据),等等。
4、寄存器:在cpu内部,由编译器管理,开发人员无法控制。
5、本地方法区:java通过java本地接口JNI(java Native Interface)来调用其它语言编写的程序,在java里面用native修饰符来描述一个方法是本地方法,这个了解下就好了。
6、非RAM存储:至于这个,我觉得不是java分配的(个人理解,不知对否),是存放永久数据的,在磁盘上。
作者:
小路飞
时间:
2013-2-20 12:58
黄玉昆 发表于 2013-2-19 14:55
其实,你现在如果刚入门,就不要研究的那么深入,很多知识不是一下子就能都学进去的,是需要日积月累,融会 ...
谢谢了,说的也是,慢慢来!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2