Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336128
  • 博文数量: 82
  • 博客积分: 2602
  • 博客等级: 少校
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-10 08:48
文章分类

全部博文(82)

文章存档

2008年(17)

2007年(65)

分类: C/C++

2007-08-31 08:47:03

一般编程主要只涉及进程的堆空间和栈空间(当然进程还有其他的,但初学可以不考虑)。

栈空间的内存是给函数内的局部变量(包括函数参数)用的,通过函数调用和函数返回自动得分配释放(实际上只是调整栈顶指针的位置)。因为这是个“自动”的过程,所以有个额外的“栈空间溢出”的问题,主要的就是函数内局部变量不宜过大(比如int array[10000]),递归调用不要嵌套过多。

堆空间的内存简单的说就是通过malloc/new申请的,你可以选择在不再使用时释放(用free/delete),但不是必须这么做——程序退出时系统会自动回收该进程所占用的内存(僵尸进程有一点例外-它要保存进程的返回值,直到被取走才释放)。不释放内存只有两个害处:一是本进程达到能申请内存的最大值然后申请失败,导致本进程无法继续正常运行;二是本进程占用内存过多,影响系统的其他进程,或者是提高本程序运行的硬件要求。

大多数情况下,程序浪费“有限”的内存是关系不大的。但如果某函数每被调用一次就浪费一点内存(即申请了内存,不再使用,却不释放),随着函数被调用次数的增多,浪费的内存趋于“无限”,就会产生严重的问题,即所谓“内存泄露”。“内存泄露”的存在有两个必要条件,一是程序在持续的“浪费”内存,二是程序没有退出。——所以,如果能保证程序在正常退出前浪费的内存不超过某一阈值,就可以不考虑释放内存(这也就是我们写小测试程序的情况)。

以上是内存申请了可以不释放的情况,其他情况下(比如程序需要持久运行,这也是实际中最常见的情况),申请的内存都需要释放。下面再说什么时候要申请(malloc/new)内存:

需要申请(malloc/new)内存是出于这样一种需要:栈空间是线程相关的(即栈空间的内存属于某一固定的线程),而我们有时需要线程无关即多个线程共享的内存(换个角度说,对于单线程程序,完全可以只用栈空间完成一切任务,即不用申请内存,只需把函数退出后仍需保留的变量声明在函数外面,代价就是函数参数个数的增多)。事实上,多线程比之单进程,唯一的进步也就是方便了对线程无关内存的访问,也就是可以让堆空间像多进程编程中的共享内存一样使用

堆空间和栈空间两者之和虽然受到32位进程4G地址空间的限制,但两者之和却可相互调整:比如线程很多时可能需要增大栈空间减小堆空间,线程共享空间需求很大时则反之。比如对于java虚拟机,输入"java -X"后有以下参数(其他参数略):
CODE:
    -Xms        set initial Java heap size
    -Xmx        set maximum Java heap size
    -Xss        set java thread stack size
阅读(1239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~