在iOS中,大家平常经常说堆区栈区,其实这些都是存在虚拟内存

虚拟内存可以主要分为五个大区(堆区栈区全局区常量区代码区)接下来我们就开始一个一个的开始讲解它们。

一,堆区(heap)

  • 是由程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减
  • 堆向高地址扩展的数据结构,是不连续的内存区域。程序员负责在何时释放内存(如用free或delete),在iOS的ARC程序中,系统自动管理计数器,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。
  • 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低。

二,栈区(stack)

  • 栈是由编译器分配和释放,用于存放程序临时创建的变量、函数的参数、局部变量等。
  • 是一块连续的内存区域,遵循先进后出的原则,向低地址的数据结构
  • 在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值 也会被存放回栈中。
  • 由于栈的后进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

三,全局区(静态)( bss segment )

  • 全局区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。static修饰的变量始终保存到常量区
  • 用来存放可执行文件中已经初始化的全局变量,也就是用来存放静态分配的变量和全局变量(.data)
  • bss段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
  • BSS段在程序执行之前会清0,所以未初始化的全局变量(静态变量)已经是0了。所以这种情况还是存放在BSS段,一旦初始化就会从BSS段中回收掉,转存到data段(数据段)中。

四,常量区(data segment)

  • 是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域
  • 通常是指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。字符串常量等,是放在只读数据段中,结束程序时才会被收回。

五,代码区(code segment/text segment)

  • 用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作

iOS 内存五大区讲解相关推荐

  1. iOS-底层原理 24:内存五大区

    iOS 底层原理 文章汇总 在iOS中,内存主要分为栈区.堆区.全局区.常量区.代码区五大区域.如下图所示 下面分别介绍这五大区 栈区(Stack) 定义 栈是系统数据结构,其对应的进程或者线程是唯一 ...

  2. iOS-底层原理 21:内存五大区

    在iOS中,内存主要分为栈区.堆区.全局区.常量区.代码区五大区域.如下图所示 下面分别介绍这五大区 栈区(Stack) 定义 栈是系统数据结构,其对应的进程或者线程是唯一的 栈是向低地址扩展的数据结 ...

  3. Java内存五大区_一:jvm的五大内存区(内存结构)

    本地方法栈:和虚拟机栈类似,只是它描述的是为虚拟机是用到的Native方法出栈和入栈的过程(通常我们不需要了解这块,它底层是C语言实现的). 虚拟机栈:描述的是线程进栈出栈的过程,线程结束内存自动释放 ...

  4. iOS内存分配五大区:

    iOS内存分配五大区: 栈区,堆区,静态区(全局区),常量区,代码区 动态数据区一般就是"堆栈",栈是线性结构,堆是链式结构. 本地变量在堆栈中.通过堆栈的基地址和偏移量来访问本地 ...

  5. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

  6. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...

  7. iOS内存管理(ARC,MRC)

    iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...

  8. Unity手游iOS内存分析和测试

    内存是Unity手游的硬伤,如果没有做好内存的相关管理和详细的测试,游戏极有可能出现卡顿.闪退等影响用户体验的现象.在此,笔者为我们介绍了一些Unity手游内存分析和测试过程中比较实用的测试场景案例. ...

  9. Objective-C runtime机制(5)——iOS 内存管理

    概述 当我们创建一个对象时: SWHunter *hunter = [[SWHunter alloc] init]; 上面这行代码在栈上创建了hunter指针,并在堆上创建了一个SWHunter对象. ...

最新文章

  1. 公益:开放一台Nacos服务端给各位Spring Cloud爱好者
  2. python【力扣LeetCode算法题库】543-二叉树的直径
  3. unity3d所要知道的基础知识体系大纲,可以对照着学习,不定期更新
  4. Ubuntu下载连接(阿里云镜像)
  5. GCD LCM UVA - 11388 (思维。。水题)
  6. 玩Python遇到的问题一二三及解决办法
  7. IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)...
  8. java 返回第k小的数_java – 给定n和k,返回第k个置换序列
  9. python创建线程在后台运行
  10. iOS -- SKTransition类
  11. LINQ(LINQ to Entities)
  12. kaggle:Costa Rican Household Poverty Level Prediction(1)DEA
  13. 云计算基础设施的定义与介绍
  14. Scheme 语言 第一次的感触!
  15. ​微信小程序 获取地理位置(显示地图并显示经纬度)​
  16. 视频分割算法在移动端如何应用
  17. ubuntu下面高效率小工具总结
  18. 借助近距离通信,实现手机作为游戏控制器掌控大屏游戏
  19. 重磅炸弹 诺基亚N71简体中文版全国抢先预览
  20. Collapsed Variational Inference(Collapsed变分推断)算法以LDA推导为例

热门文章

  1. node.js使用puppeteer来html生成pdf
  2. 数据结构与算法—前导
  3. 技术面试要做哪些准备?
  4. 在opensuse上安装TL-WDN5200免驱版无线网卡
  5. 总结自己大学学习Java过程感悟
  6. git 更新某个目录或文件
  7. 多线程与高并发day04
  8. 属性级情感分析(于restaurant14和laptop14数据集上使用LSTM和GRU、 MemNet和IAN以及CNN等)的对比分析
  9. c# uri 取文件名_C# System.Uri类_获取Url的各种属性_文件名_参数_域名_端口等等
  10. emby,jellyfin,kodi系列