1. 内存分区图:
2. 分区介绍:
2.1. 栈区:
存放:临时的局部变量、函数的传参
特点:占用内存小,速度快
数据的存储和释放采用栈式结构,先入后出,类似于C++下类的构造析构函数
2.2. 堆区:
存放:程序员malloc、new的动态内存变量
特点:
- 内存空间较栈来说相当大,但运行速度相比栈慢
- 采用链式结构连接空闲的内存碎片
- 动态申请的内存由程序员操作释放(free、delete),除此之外在程序结束时或关机的情况下申请内存才会被收回,否则将出现严重的内存泄露事故
2.3. 可读写区:
存放:静态变量和全局变量
已初始化的处于data区;未初始化的数据处于bss区;
特点:结束后由系统收回
2.4. 只读区:
存放:常量、程序编译过的可执行二进制代码
特点:在程序运行的时候数据不允许被修改
3. 栈和堆的比对:
堆: | 栈: |
由程序员自行申请分配,速度较慢 | 由系统自动分配内存空间,速度较快 |
使用结束后,需要人为释放申请的内存,避免内存泄漏 关机或者程序关闭时,内存才会被释放 | 在函数的生命周期结束后,由系统自动收回 |
在Windows系统中,链式结构由低地址向高地址延申 | 在Windows系统中,栈式结构由高地址向低地址延申 |
是不连续的内存区域 堆的获取空间受限于操作系统的虚拟内存空间 | 是一块连续的固定大小的内存空间:规定栈的大小为2M |
可获取空间较灵活,可以获取较大空间 | 可以获取的栈空间较小,申请过大空间产生栈溢出的错误 |
4. 虚拟内存:
- 虚拟内存是计算机系统内存管理的一种技术。当系统物理内存不够使用时,将硬盘上的部分空间当做内存(RAM)使用,使得计算机可以运行更多的应用程序。
- Windows系统中,虚拟内存在硬盘上是为一个比较大的文件,文件大小即虚拟内存的大小,文件名是PageFile.Sys
- 虚拟内存并不是备用内存
5. 备用内存:
- 备用内存,备用内存本来是空闲的内存,微软想让这部分内存也发挥作用,就把硬盘上常用的文件缓存到这里,无需从硬盘进行读取,以此提高性能。这部分缓存的内存就是备用内存。
- 若可用内存不足以运行新的任务,备用内存将会为新的任务释放空间。这个方案理论上是可行的,既提高了性能,也不会影响内存的使用。但问题在于,备用内存有时会占用过高且不会自动释放,据说是系统很久以来便存在的Bug,至今(Win11)也没有解决。