计算机程序内存分布(内存分布情况、五大分区)

计算机程序内存分布(栈、堆、BSS、数据区、代码段)

存储器

  • RAM:随机存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
  • ROM: 只读存储器

CPU、RAM、ROM之间的关系图
image

程序(App)启动运行

App安装到手机后,存储在ROM中,程序启动后,系统会把App程序从ROM里面拷贝到RAM,然后从RAM里面执行代码。

RAM内存分布

RAM内存中分5个区

程序中内存分布图

  • 结合版
    image
  • 其他版本
    imageimage
    image

栈区(stack):

栈:stack,
栈又称堆栈,存放程序的局部变量(但不包括static声明的变量, static 意味着在数据段中 存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。

  • 存放的局部变量、函数的参数值、函数跳转地址

  • 先进后出,一旦出了作用域就会被销毁

  • 栈区地址从高到低分配

  • 自动管理内存

堆区(heap):

堆:heap,
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)。

  • 堆区的内存分配使用的是alloc;

  • ARC的内存的管理,是编译器再便宜的时候自动添加 retain、release、autorelease;

  • 堆区的地址是从低到高分配)

  • 需要程序员管理内存;

全局区/静态区(static):

也叫数据段

  • 存放全局变量和静态变量(未初始化过 、初始化过)

  • 初始化的全局变量和静态变量存放在一块区域(BSS区),未初始化的全局变量和静态变量在相邻的另一块区域(sata数据区)

  • 程序结束后由系统释放

BSS(全局区/静态区static):

BSS段:Block Started by Symbol,
一般是指存放程序中未初始化的全局变量的一块内存区域
BSS段属于静态内存分配

数据段

数据段:data segment,
一般是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

常量区

  • 常量区:常量字符串就是放在这里;

  • 存放常量字符串

  • 程序结束后由系统释放

代码区

代码段:code segment/text segment,
通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些 只读的常数变量 ,例如字符串常量等。程序段为程序代码在内存中的映射。一个程序可以在内存中有多个副本。

代码区:

  • 存放App代码

  • 程序结束后由系统释放

注意事项

  1. 栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出

  2. 当App启动后,代码区,常量区,全局区大小已固定,而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃。

  3. 静态内存
    静态内存是由系统自动分配内存,由系统自动释放。静态内存是在栈中分配的,假如main函数调用另一个函数,那么就把被调用函数压到一个栈里面。执行这个被调函数就是使系统为这个函数分配的所有内存空间逐个出栈。出栈全部结束就是被调用函数执行完毕。

  4. 动态内存
    而动态内存是由程序员手动释放,函数终止不会被系统自动释放。这说明他肯定不是在栈里面分配的。那他是在什么地方分配的呢?是在“堆中”分配的,栈是一种存储结构,堆不是一种存储结构,堆是分配内存的一种排序方式。也就是说,动态内存是以堆排序的方式分配的。以前讲排序,如冒泡排序,插入排序,选择排序,快速排序。堆排序也是一种排序方式,因为动态内存是在堆中分配的,是以排序的方式分配的,不是在栈中,所以函数运行结束后也不会被释放。

    也因为动态内存是由程序员手动分配,手动释放,所以这时候就会有一个比较严重的问题:如果忘记释放了,就会导致内存泄露,所以动态分配内存有优点,也有缺点。动态内存的使用非常灵活,但需要注意的问题也很多。

内存分布对应关系
image

posted @ 2023-08-13 23:52  邹木木  阅读(3136)  评论(0编辑  收藏  举报