iOS ------ 内存五大分区

1,内存的概念:

虚拟内存(Virtual Memory):虚拟内存是操作系统提供的一种机制,它使得应用程序能够访问超出物理内存限制的内存空间。虚拟内存将应用程序的内存地址空间分割成固定大小的页面(Page),并将这些页面映射到物理内存或者存储设备上的磁盘空间。

物理内存(Physical Memory):物理内存是计算机实际存在的内存硬件,也称为RAM(Random Access Memory)。它是用来存储应用程序和操作系统运行所需的数据和指令。

虚拟内存和物理内存的关系如下:

  1. 虚拟内存管理:iOS使用虚拟内存管理技术来管理应用程序的内存使用。每个应用程序都有自己的虚拟内存空间,这样每个应用程序就可以独立地访问一定范围的内存地址,而不需要担心与其他应用程序发生冲突
  2. 内存分页:iOS将虚拟内存空间划分为固定大小的页面,并使用分页技术将这些页面映射到物理内存或者存储设备上的磁盘空间。当应用程序需要访问某个页面时,操作系统将负责将该页面从磁盘加载到物理内存,并建立对应的映射关系。
  3. 虚拟内存和物理内存的映射:虚拟内存和物理内存之间存在着映射关系。虚拟内存中的页面并不一定都在物理内存中,有些页面可能被置换到磁盘上的交换空间中。当应用程序访问被置换的页面时,操作系统会将其从磁盘恢复到物理内存中,这个过程称为页面调入(Page In)

在这里插入图片描述

在iOS中,内存被分为五大区域:栈区,堆区,全局/静态区,常量区,代码区。这些有属于虚拟内存
在这里插入图片描述

2,栈区

  • 栈是一块连续的内存区域从高地址向低地址进行存储,遵循先进后出原则
  • 栈的地址空间在iOS中是以0X7开头
  • 栈区一般在运行时分配,内存空间有系统分配,声明的变量超过作用域后内存就会自动释放
  • 函数内部定义的 局部变量,方法参数(方法中默认参数:self,cmd),都存在栈区。

优缺点:

  • 优点:不会产生内存碎片,(回收释放有系统自己控制),高效的读写速度
  • 缺点:栈的内存空间较小(iOS主线程栈大小1MB,其它线程512KB),存储数据不灵活(存储内容基本固定,由编译器分配)

self和_cmd。

self:self是一个隐式参数,它代表当前方法所属的对象实例。在Objective-C中,每个对象实例在调用方法时都会自动传入self作为第一个参数。通过self,可以在方法中访问和操作当前对象的属性和方法。
_cmd:_cmd也是一个隐式参数,它代表当前方法的选择器(Selector)。选择器是Objective-C中用于唯一标识方法的一种机制,它包含方法名和参数类型信息。在方法内部,可以使用_cmd来获取当前方法的选择器,从而进行一些运行时的操作,比如动态调用其他方法。

- (void)testStack {int a = 10;NSLog(@"a == %p",&a);NSLog(@"方法参数 self:%p",&self);NSLog(@"方法参数 cmd:%p",&_cmd);
}打印结果:
a == 0x7ffeee47d75c
方法参数 self0x7ffeee47d768
方法参数 cmd:0x7ffeee47d760

3,堆区

  • 堆是不连续的内存空间从低地址像高地址进行存储,类似于链表结构(便于增删,不便于查询)遵循先进先出原则
  • 堆的地址空间在iOS中是以0X6开头,其空间分配是动态的
  • OC中使用alloc或者new,block或者copy创建的对象都会存在这里。ARC下编译器会自动在合适的时候释放内存,而在MRC下需要开发者手动释放
  • C语言中使用malloc、calloc、realloc分配的空间,需要free释放。
  • 开发人员一般要关注变量的生命周期,如果不及时释放,会造成内存泄漏,只有等程序结束时有系统统一回收。

优缺点:

  • 优点:获得空间灵活,分配内存较大
  • 内存需要手动管理,容易产生碎片,读取速度比栈区慢

访问堆区内存时,一般先通过对象读取到对象所在栈区的指针地址,然后通过指针地址访问堆区。

- (void)testHeap {NSObject *object1 = [NSObject new];NSObject *object2 = [NSObject new];NSLog(@"object1 = %@",object1);NSLog(@"object2 = %@",object2);
}打印结果:
object1 = <NSObject: 0x600002b8f430>
object2 = <NSObject: 0x600002b8f420>

4,全局/静态区

  • 该区是在编译时分配的内存空间,在iOS中一般一0X1开头,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放
  • 为初始化的全局变量和静态变量,即BSS区(.bss)
  • 已初始化的全局变量和静态变量,即数据区(.data)

其中,全局变量是指变量值可以在运行时被动态修改,而静态变量是static修饰的变量,包含静态局部变量和静态全局变量

static修饰的变量仅执行一次,生命周期为整个程序运行期

int clB = 10;
static int bssB = 10;- (void)test {NSLog(@"clA == %p",&clA);NSLog(@"clB == %p",&clB);
}打印结果:
clA == 0x104131424
clB == 0x104131408

5,常量区

  • 常量区是编译时分配的内存空间,在程序结束后由系统释放。
  • 主要存放已经使用了的,且没有指向的字符串常量
  • 存放常量(整型,字符型,浮点,字符串等),整个程序运行期不能改变
  • 空间由系统管理,生命周期为整个程序运行期
- (void)test {NSString * name = @"HT";NSLog(@"NSString name -> 内存地址: %p", name); // 【字符串内容】 存放在常量区
}
输出:NSString name -> 内存地址: 0x1007d4118

6,代码区

  • 代码区是编译时分配主要用于存放程序运行时的代码,代码会被编译成二进制存进内存的代码区。
  • 在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。(编译期将代码转换为CPU指令)

7,函数栈

  • 函数栈有称栈区,在内存中从高地址往低地址分配
  • 栈帧是指函数运行中且未完成时占用的一块独立连续的内存区域
  • 应用中新创建的每个线程都有知己专有的栈空间,栈可以在线程期间自由中使用。而线程中有大量的函数调用,这些函数共享线程这个栈空间。每个函数所使用的栈空间是一个栈帧,所有栈帧就构成了这个线程完整的栈
  • 函数调用发生在栈上的,每个函数的相关信息(例如局部变量,调用记录)都存储在一个栈帧,每次执行一次函数调用,就会生成一个与其相关的栈帧,然后将栈帧压入函数栈。当函数执行结束,则将此函数的栈帧出栈并释放。

栈堆溢出:
一般情况下应用程序是不需要考虑堆和栈的大小的,但是事实上堆和栈都不是无上限的,过多的递归会导致栈溢出过多的alloc变量会导致堆溢出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/679109.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis集群分片

什么是集群 集群是由多个复制集组成的,能提供在多个redis节点间共享数据的程序集 简而言之就是将原来的单master主机拆分为多个master主机,将整个数据集分配到各主机上 集群的作用 集群中可以存在多个master,而每个master可以挂载多个slave自带哨兵的故障转移机制,不需要再去…

整型提升和算术转换<C语言>

前言 在C语言中进行整数运算时&#xff0c;我们通常把操作数设置为int型变量&#xff0c;按照整数的精度计算&#xff0c;如果是非int型的整数进行计算时&#xff0c;会有那些变化呢&#xff1f; 整型提升 关于整型提升的情况&#xff0c;通常发生在char型和short int型中&…

算法学习(6)-最短路径

目录 Floyd-Warshall算法 Dijkstra算法 Bellman-Ford算法 Bellman-Ford的队列优化 最短路径算法对比分析 Floyd-Warshall算法 现在回到问题&#xff1a;如何求任意两点之间的最短路径呢&#xff1f; 通过之前的学习&#xff0c; 我们知道通过深度或广度优先搜索可以求出两…

深度剖析muduo网络库1.1---面试提问(阻塞、非阻塞、同步、异步)

在面试过程中&#xff0c;如果被问到关于IO的阻塞、非阻塞、同步、异步时&#xff0c;我们应该如何回答呢&#xff1f; 结合最近学习的课程&#xff0c;我作出了以下的总结&#xff0c;希望能与大家共同探讨&#xff01; 先给出 陈硕大神原话&#xff1a;在处理IO的时候&…

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型&#xff0c;通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成&#xff0c;其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外&#xff0c;有些模型会增加其他的层(归一 化…

C++贪心算法

关于string的系统函数&#xff01; &#xff08;注&#xff1a;以下函数只可用于string&#xff0c;不适用其他类型的变量&#xff09; ① a.size(); 这个系统函数是用来获取这个string变量的长度的&#xff0c;我们通常会新建一个变量来保存他&#xff0c;以便之后使用。 …

linux centos7.9 快速安装python3环境

安装好linux centos7.9 默认只有python2的环境如下: python2.7.5这个很老旧的版本了,有很多新库不支持,性能可能也不行。 接下来快速安装python3环境,并设置源做到快速安装包,设置虚拟环境,打造强大的python实验环境: 1,下载,安装最小化的miniconda,可以通过这个自…

同一局域网如何从Windows系统拷贝文件到银河麒麟系统

1. 先将Windows下的、被拷贝文件所在文件夹设置为共享目录&#xff1a;在文件夹上单击右键选择“属性”菜单&#xff0c;弹出如下对话框&#xff1a; 按数字顺序单击鼠标左键&#xff0c;弹出如下对话框&#xff1a; 并将权限开放为Everyone&#xff0c;单击“共享”按钮。 在…

嵌入式开发八:STM32启动过程分析

本次给大家分析 STM32F4 的启动过程&#xff0c;这里的启动过程是指从 STM32 芯片上电复位执行的第一条指令开始&#xff0c;到执行用户编写的 main 函数这之间的过程。我们编写程序&#xff0c;基本都是用 C 语言编写&#xff0c;并且以 main 函数作为程序的入口。但是事实上&…

腾讯云服务器之ssh远程连接登录

一、创建密钥绑定实例 创建密钥会自动下载一个私钥&#xff0c;把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户权限 2、添加当前用户权限 查看当前用户名 echo %USERNAME%三、ssh远程连接到服务器 ssh ubuntu175.xxx.xxx.112 -i C:\Crack\cs2.pem四、修改root密码 s…

2024-05-08 问AI: 在深度学习中,介绍一下RMSProp 优化器

文心一言 在深度学习中&#xff0c;RMSProp&#xff08;Root Mean Square Propagation&#xff09;优化器是一种常用的优化算法&#xff0c;主要用于神经网络训练的梯度下降算法的变体。它是对Adagrad优化器的一种改进&#xff0c;旨在解决Adagrad中学习率过快下降的问题。 R…

可视化面板布局适配屏幕-基于 flexible.js + rem 智能大屏适配

可视化面板布局适配屏幕-基于 flexible.js rem 智能大屏适配 VScode 安装cssrem插件引入flexible.js在之后的开发都使用rem为单位&#xff0c;安装cssrem插件就是为了快捷将px转为rem我们的设计稿是1920px&#xff0c;设置最小宽度为1024px&#xff0c;最后&#xff0c;我们可…