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.mfbz.cn/a/604434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

elementui+vue通过下拉框多选字段进行搜索模糊匹配

从字典中选择的值为["01","03"],在最开始的时候进行的处理是类似于表单提交的时候将json对象转换成了String类型 nature:["01","03"] this.queryParams.nature JSON.stringify(this.queryParams.nature); mapper层 <if test&quo…

PHP单独项目启动演示

文章目录 phpstudy得到文件打开phpStudy.exe运行项目 phpstudy 得到文件 一般我们会得到这么一个项目文件&#xff0c;如果外层有“中文路径”&#xff0c;请剪切此内容作为项目根目录即可 打开phpStudy.exe 因为我又正常的编程环境和mysql&#xff0c;所以这里是正常的&a…

开机弹窗找不到OpenCL.dll是怎么回事,哪种修复方法更推荐

当用户在操作电脑过程中遇到系统提示“OpenCL.dll丢失”时&#xff0c;这究竟是怎么一回事呢&#xff1f;OpenCL.dll&#xff0c;作为Open Computing Language&#xff08;开放计算语言&#xff09;的重要动态链接库文件&#xff0c;它在图形处理器&#xff08;GPU&#xff09;…

企业内部适用的五大知识库工具测评推荐

随着企业规模的不断扩大和业务复杂性的增加&#xff0c;要想更高效地进行企业管理就不得不使用知识库管理工具。本文将对五款企业内部适用的知识库工具进行测评推荐&#xff0c;帮助企业选择出更适合自己的知识库管理工具。 一、Helplook AI知识库 Helplook AI知识库是一款搭建…

PotPlayer v1.7.22218 全格式影音播放器,无广绿色版!

软件介绍 PotPlayer是一款多功能且免费的媒体播放软件&#xff0c;兼容多种音频和视频格式。提供了丰富的功能性以及个性化设置&#xff0c;以迎合不同用户的需求。友好的用户界面&#xff0c;允许用户自定义皮肤和快捷键&#xff0c;提升了操作的便利性。 此外&#xff0c;Po…

JavaScript快速入门系列-1(JavaScript简介)

第一章:JavaScript简介 1. JavaScript简介1.1 什么是JavaScript1.2 JavaScript的历史与应用1.3 环境搭建:浏览器与Node.js2. JavaScript语言基础2.1 变量声明:let, const, var2.2 数据类型:字符串、数字、布尔值、对象、数组、null与undefined2.3 运算符:算术、比较、逻辑…

微信云小程序快速上手云数据库+云函数+云存储的操作

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

探索Java的未来

探索 Java 的未来是一个非常有趣的话题。Java 是一种广泛使用的编程语言&#xff0c;自 1995 年诞生以来&#xff0c;它已经在软件开发领域占据了重要的地位。尽管有些人担心 Java 可能会因为新技术的出现而变得不再相关&#xff0c;但实际情况并非如此。让我们来看看一些关于 …

Python | Leetcode Python题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; class Solution:def mySqrt(self, x: int) -> int:if x 0:return 0C, x0 float(x), float(x)while True:xi 0.5 * (x0 C / x0)if abs(x0 - xi) < 1e-7:breakx0 xireturn int(x0)

AI Agent智能应用从0到1定制开发(wanjie)

AI Agent&#xff08;人工智能体&#xff09;是一种能够感知环境、进行决策和执行动作的智能实体。不同于传统的人工智能&#xff0c;AI Agent 具备通过独立思考、调用工具去逐步完成给定目标的能力。 「完结12章」AI Agent智能应用从0到1定制开发 AI Agent 和大模型的区别在…

Windows 虚机扩容C盘

Windows 虚机扩容C盘 操作思路1、新增磁盘容量2、划分磁盘空间3、扩容对应盘 操作步骤 操作思路 1、新增磁盘容量 2、划分磁盘空间 3、扩容对应盘 操作步骤 1、虚机新增磁盘空间 先确认宿主机是否有足够空间&#xff0c;有足够空间后&#xff0c;编辑虚机&#xff0c;增加…

【3D目标检测】常见相关指标说明

一、mAP指标 mean Average Precision&#xff08;平均精度均值&#xff09;&#xff0c;它是目标检测和信息检索等任务中的重要性能指标。mAP 通过综合考虑精度和召回率来衡量模型的总体性能。 1.1 精度&#xff08;Precision&#xff09; 表示检索到的目标中实际为正确目标…

嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

随着物联网和智能设备的快速发展&#xff0c;嵌入式开发和鸿蒙系统成为了当前技术领域的热门话题。鸿蒙系统作为华为推出的全场景分布式操作系统&#xff0c;旨在连接各种智能设备&#xff0c;提供无缝的跨设备体验。而南向开发则是鸿蒙系统中的一个重要方向&#xff0c;主要涉…

长难句打卡5.6

For H&M to offer a $5.95 knit miniskirt in all its 2,300-plus stores around the world, it must rely on low-wage overseas labor, order in volumes that strain natural resources, and use massive amounts of harmful chemicals. 翻译:H&M若要在其全球总共2…

OpenCV|简单绘制一个矩形

OpenCV中的rectangle() 为绘制矩形命令&#xff0c;形式如下&#xff1a; # (img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int ..., lineType: int ..., shift: int ...)cv2.rectangle(img, pt1, pt2, …

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战&#xff0c;例如右侧截尾&#xff08;右侧截尾表示未观察到的事件发生&#xff0c;例如研究结束时还未发生事件&#…

Django-新冠疫情数据分析系统-67684

目 录 摘要 1 绪论 1.1 研究背景 1.2论文结构与章节安排 2 新冠疫情数据分析系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析…

Stuff Error的解决办法

Stuff Error的解决办法 一、问题描述 在使用CANoe、CANalyzer设备做一些总线CAN信号的通信测试过程中&#xff0c;会出现Stuff Error这类的错误&#xff0c;具体trace如下&#xff1a; 二、解决办法 错误原因&#xff1a;Stuff Error通常是物理原因引起的 常见的解决方案有…

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”&#xff0c;通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查&#xff0c;这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…

Redis(主从复制搭建)

文章目录 1.主从复制示意图2.搭建一主多从1.搭建规划三台机器&#xff08;一主二从&#xff09;2.将两台从Redis服务都按照同样的方式配置&#xff08;可以理解为Redis初始化&#xff09;1.安装Redis1.yum安装gcc2.查看gcc版本3.将redis6.2.6上传到/opt目录下4.进入/opt目录下然…