内存五大分区

作者: 深圳_你要的昵称 | 来源:发表于2020-11-02 15:02 被阅读0次

按照内存地址从高(0xffffffff)到低(0x00000000)的顺序排列,可分为5大分区:栈区 -> 堆区 -> 全局静态区 -> 常量区 -> 代码区。大致分布如下图所示👇

  1. 栈区
    • 栈区的内存空间由系统管理 --> 即方法调用开始时开辟空间,方法调用结束时回收空间。
    • 栈区是从高地址低地址扩展,是一块连续的内存区域,遵循先进后出,后进先出(FILO)原则,使用效率高。
    • 栈区的内存空间是在运行时由系统进行分配。
    • 哪些变量是栈区的?例如方法的入参,内部定义的局部变量等,都存放在栈区
  2. 堆区
    • 最大的特点 --> 空间大,需程序员自己手动管理。(当然,在ARC时代也是系统自动管理的)
    • 堆区是从低地址高地址扩展,与栈区相反,遵循先进先出(FIFO)的原则。
    • 堆区由系统api开辟空间(c/c++ --> malloc、calloc、realloc, oc --> alloc new),这个空间可以是不连续的,以链表结构存在,
    • 开辟出的空间的首地址是在栈区,例如LGPerson *person = [[LGPerson alloc] init];这个person指向所指向的地址是在栈区
    • 内存回收 --> free回收,做了两件事,一是释放堆区的内存,二是将栈区的指针置为nil。
  3. 全局静态区
    • 存放全局变量静态变量
    • 内存空间也是由系统管理 -->程序启动开辟程序结束回收,程序执行期间一直存在
    • static修饰的变量仅执行一次,生命周期为整个程序运行期
  4. 常量区
    • 存放常量👇(整型、字符型,浮点型,字符串等),整个程序运行期不能被改变
      • 已初始化全局变量
      • 已初始化静态变量
    • 空间由系统管理,生命周期为整个程序运行期
  5. 代码区
    • 存放程序执行的CPU指令,一种二进制文件。(编译期将代码转换为CPU指令)

补充概念

  1. 内存泄漏(memory leak):是指申请的内存空间使用完毕之后未回收
    一次内存泄露危害可以忽略,但若一直泄漏,无论有多少内存,迟早都会被占用光,最终导致程序crash。(因此,开发中我们要尽量避免内存泄漏的出现)
  2. 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用。
    通俗理解就是内存不够用了,通常在运行大型应用或游戏时,应用或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。最终导致机器重启或者程序crash

简单来说:

概念 区别说明
内存泄漏 供应方(操作系统)能提供给需求方(App)的内存越来越少。
内存溢出 需求方(App)需要的内存过大,超过供应方(操作系统)负载。

相关文章

  • 内存管理

    目录一、内存分区 1、RAM和ROM 2、内存的五大分区二、内存管理 1、OC内存管理是指什么?OC内存管理的本质...

  • Swift--004:内存分区 & 方法调度

    内存分区 内存五大区内存分区按地址从高到低排列: 栈区->堆区->全局静态区->常量区-> 代码区栈区的地址比堆区...

  • iOS 内存管理

    内存问题主要体现在两个方面:内存溢出和野指针异常 内存的五大分区 栈区 系统开辟,系统释放,...

  • Block 有三种类型

    内存五大内存分区-----堆、栈、自由存储区、全局/静态存储区和常量存储区.1. 堆,就是那些由new分配的内存块...

  • 五大内存区

    一:五大内存区 说到内存分区,内存即指的是RAM。 栈区,堆区,全局区,常量区,代码区 1、栈区: 创建临时变量时...

  • 内存五大分区

    按照内存地址从高(0xffffffff)到低(0x00000000)的顺序排列,可分为5大分区:栈区 -> 堆区 ...

  • 内存五大分区

    一、栈区(stack) 由编译器自动管理。存放函数的参数值,局部变量等。操作方式类似于数据结构中的栈。栈是由高地址...

  • 操作系统-存储管理

    为什么内存要分区?分区有哪些类型? 内存分区是为了方便地支持多程序运行。分区管理分为固定分区和可变分区,固定分区是...

  • C++运算符重载实现(加号、左移、递增、赋值、关系运算符、函数调

    先来复习一下C++的内存分区问题~ C++内存分区 C++程序的内存分区可划分为四大内存分区:堆、栈、全局/静态存...

  • 堆栈区别

    五大内存分区在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由...

网友评论

    本文标题:内存五大分区

    本文链接:https://www.haomeiwen.com/subject/ozupvktx.html