背景
Linux 系统为内核分配 1G 内存,Windows 系统为内核分配 2G 空间,剩余的内存供用户程序使用。
用户空间的划分
- 栈
用于维护函数调用的上下文,在用户空间的最高地址处分配 - 堆
用来容纳应用程序动态分配的内存区域,比栈大很多。常在栈的下方, - 可执行文件映像
存储可执行文件在内存里的映像 - 保留区
不是一个单一的内存区域,而是对内存中收到保护而禁止访问的内存区域的总称 - 动态链接库映射区
装载动态链接库
栈
计算机科学中的栈
一种存放数据的特殊容器,入栈出栈规则是 FILO
计算机系统中的栈
具有以上属性的动态内存区域,入栈使栈增大,栈顶地址变小,出栈使栈减小,栈顶地址增大
保存函数调用时所需的维护信息,栈上的数据在函数返回时就被释放掉 ,无法将数据传递至函数外部
栈的内容
- 函数的返回地址和参数
- 临时变量,如函数的费静态局部变量以及编译器自动生成的其他临时变量等
- 保存的上下文,函数调用前后所需要保持不变的寄存器
堆
堆是一块巨大的内存,占据整个虚拟空间的绝大部分,程序可以申请一块连续内存,自由使用,在程序主动放弃之前都会一直有效。
堆分配算法按需分配、释放其中的空间。有以下几种方式:
- 空闲链表
把堆中各个空闲的块按照链表方式连接,用户请求一块空间时,遍历整个列表,找到合适大小的块并将它拆分,当用户释放空间时将它合并到空间链表中
- 位图
将堆划分为大量的块(block),每个块大小相同,用户请求内存是,分配数个块的空间给用户,第一个称为头(Head),其余称为主体(body),用整数数组记录块的使用情况,每个块只有头/主体/空闲三种状态
- 对象池
如果每次分配空间大小都一样,就按照该大小将堆划分为大量的小块,每次请求只需要找到一个小块即可。