【iOS开发】---- 使用Instrument检查内存占用过多的代码

2024-01-05 00:18

本文主要是介绍【iOS开发】---- 使用Instrument检查内存占用过多的代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      本文要介绍的是如何使用Instrument来检查代码中哪里占用内存较多。

      先上一篇《Instrument使用指南》(点击这里去下载)中的文章,然后再用例子来说明如何使用。

      当然,你可以跳过分割线的内容,不过建议阅读以下。



-----------------------------------------我是万恶的分割线----------------------------------------------

5.2.2 使用Allocations Instrument工具分析数据

    Allocations instrument 工具是一个跟踪所有由应用程序分配的内存的工具。所以你可以使用那些信息来识别在你应用程序里面的内存分配模式,并识别你的应用程序内存效率低下的地方。Allocations instrument 提供了和之前应用程序的ObjectAlloc 一样甚至更好的数据修整和修剪设施。因为这整合在 Instruments 应用环境里面,你也可以使用该 instrument 工具来关联你应用程序的内存行为到其他类型的行为。

    因为它跟踪整个应用程序生命周期的内存分配,你必须从 Instruments 应用里面加载你的程序以便 Allocations instrument 工具可以收集它所需要的数据。在加载的时候,Allocations instrument 使用系统中已有的挂钩(hooks)来记录与你应用程序中分配和释放事件相关的信息,无论这些事件起源于系统标准分配入口还是你自己自定义的分配库。随着数据流的到来,instrument 更新并实时的向你显示内存是如何被分配的。

    Allocations instrument 可以工作在使用标准分配函数(如 malloc,calloc 或free)的应用程序,而且也也可以工作在使用垃圾回收(garbage collected)的应用程序上面。后一种情况,收集器依然调用 free 来释放 GC-aware(GC 感知)内存。Allocations instrument 同样可以在构建在分配内存之上的例程里面工作,包括 CoreFoundation 和 Cocoa 的内存分配例程。

注意:Allocations instrument 替代了 ObjectAlloc 应用程序,而 ObjectAlloc 应用程序在 Mac OSX v10.5 及其之后不可用。


分析对象分配的数据
    Allocation instrument 工具的目的是为你显示你的应用程序如何使用内存。内

    存是系统重要的资源,你应该明智的使用它。每个内存分配都包含了直接成本和潜在的长期成本。直接成本就是它分配内存所消耗的时间,包括创建新的虚拟内存页面和把它们映射到物理内存上面。它也有可能包括把陈旧的内存页面写入硬盘。而从长远来看,保持块状的物理内存可能触发系统额外的页面,这和其他页面操作一样可能对系统性能损耗很大。

    和所有工具一样,Allocation 工具开始的地方也是跟踪面板。默认配置下,跟踪面板图形化你当前应用程序使用内存数量的净额。使用 instrument 的检查器,你可以修改视图让它显示分配的密度,即内存分配发生的地方,或你也可以让它显示堆栈的深度。分配密度图可以让你查看在你程序里面内存分配发生的频率。分配密度的尖峰意味着潜在的瓶颈,而你可以通过预先分配块或减少对其他块的依赖来减缓该情况。

    无论你使用检查器的任何显示选项,跟踪面板默认情况下都会显示所有类型对象的分配情况。为了集中于特定内存分配的子集,你可以使用详细面板来配置你想要在跟踪面板图形显示的对象。为了集中于特定的对象类型或块大小,打开详细面板并把它设置为列表模式(table mode)。在该模式下,详细面板通过对象类型和大小对内存分配进行排序。图形的列包含了复选框可以让你想要选择图形化的对象。取消所有Allocations 的复选框(默认情况下就是这样),然后选择其他对象类型的复选框来相应更新跟踪面板。如果你勾选了多个复选框,Allocations instrument 会为图形生成不同颜色的层。

   详细面板(列表模式下)显示其他有用的信息来帮你发现潜在的分配问题。列表中整体分配的净分配的列显示了当前活动对象和它有史以来创建数量的直方图。随着净分配占整体分配比例缩小,直方图的条形颜色会跟着改变。蓝色的直方图条形代表了合理的比例,而当改变为红色时意味着比例降低,可能需要核查一下。

   尽管列表模式对于你获得内存分配的全局图非常有帮助,但是详细面板集合了三个视图模式的优点。表 5-3 描述了每个模式的显示信息和你如何使用这些模式来发现问题。 



     Allocations instrument 的扩展详细面板主要显示了所选择的分配事件的堆栈信息。对于某些分配事件,该面板也显示了关于事件的描述,包括事件的类型和大小,和对象的引用数(retain count)。该信息可以帮你在你的代码中定位事件。

page57image936

跟踪引用数的事件
    当你把 Allocations instrument 添加到你的文档里面的时候,它的初始化配置

是只记录内存的分配和释放的事件。默认情况下,它不会记录引用数的事件,比如CFRetain 和 CFRelease 的调用。原因是记录引用数的事件会给从进程里面收集数据增加了额外的开销,而且在大部情况是不需要的。然而如果你的代码发生内存泄露,你可能想要配置 Allocations instrument 来记录这些事件作为你努力追查泄露的一部分。特别是,你可以查看任何不匹配的 retain 和 release 的事件来查看一个对象是否最后引用被删除了而它仍然保留着。

    注意:随着“Record referenc counts”选项被设置,Allocations instrument 在模板文档里面查找内存泄露地方,这会帮助你追踪到内存的泄露。

    过滤详细面板的内容
    表 5-4 列出了高级的配置选项,你可以应用它们到 Allocations instrument 记录的事件上面。你使用这些选项来集中于分析特定时间发生的事件,或涉及你代码的特定部分。所有的这些选项仅当使用大纲或图形模式查看数据的时候才可用。在列表模式下,Allocations instrument 显示所有分配的历史记录。 


    当你应用一个 instrument 的配置选项的时候,不要忘记你也可以限制样本数据基于这些样本何时被收集。每个跟踪文档里面的 Inspection Range 控件可以让你查看特定样本点的数据。该特性和其他 instrument 的配置选项组合使用。关于更多如何使用 Inspection Range 控件的信息,参阅“查看一个时间范围的数据”部分。 

-----------------------------------------我是万恶的分割线----------------------------------------------





现在来看看具体如何使用把。

首先我在代码中添加以下代码,让内存不停的消耗:

-(TMQuiltViewCell *)quiltView:(TMQuiltView *)quiltView cellAtIndexPath:(NSIndexPath *)indexPath
{NSString *identifierStr = @"photoIdentifier";TMPhotoQuiltViewCell *cell = (TMPhotoQuiltViewCell *)[quiltView dequeueReusableCellWithReuseIdentifier:identifierStr];if (!cell){cell = [[[TMPhotoQuiltViewCell alloc] initWithReuseIdentifier:identifierStr] autorelease];}for (int i = 1; i<100; i++){UIView *view = [[UIView alloc] init];}cell.photoView.image = [self imageAtIndexPath:indexPath];cell.titleLabel.text = [NSString stringWithFormat:@"%d", indexPath.row + 1];return cell;
}


上面的for循环中会不停的初始化一个view,这样就会不停的消耗内存。当然,实际中你并不知道哪儿会消耗内存。现在我们要做的就是用工具将这个代码给找出来。

首先点击如下图所示选项:


点击profile。出现如下界面,选Allocations instrument ,如下图所示。


选择了之后,就会出现instrument的面板,具体每个地方做什么用我就不解释了,《instrument使用指南》已经写的很清楚了。

然后要做的就是使内存不停的消耗,因为我这里把代码写在表的代理中,只要不停的滚动表就行了。

不停地一边滚动表格一边观察instrument面板如下图所示位置的变化:


      直方图中,每个柱条(忘了该怎么称呼了,就这么叫吧)里有两种颜色,短的那个表示叫净分配字节数(Net Bytes),是当前已经分配内存但是仍然没有被释放的字节的总数,而长的叫做总分配数(#Overall),是所有当前已经分配内存,包括已经被释放了的对象或内存块的总数。不停的滚动表,会发现一些柱条中短的猛的增加,将他们勾选,然后重点观察。


      过了一会儿,出现如下图所示情况(不一定每次都变得红彤彤的,但是猛地增加应该就有问题了):


可以看到详细面板中有三条大红杠,根据指南中加粗的文字来看它们应该就是问题所在了,将粗箭头所指的游标选中波峰位置,点击细箭头所指位置,跳转到如下界面:


从上图可以看到,绿色箭头所指的一行是灰色的,表示选中的波峰时执行情况,右侧面板粉红箭头指示的地方即耗内存比较多的地方,也许你的右侧面板没出现,点击红色箭头所指示的位置即可。

然后双击右侧粉红箭头所指代码(有两行,先点击第一行),如下图所示:


终于找到了吃内存的地方了!刚才我们只点击了第一行,再点击第二行,你会发现其实与上图中消耗1.3%的地方是一个地方,所以我想只要点击最上面的代码即可,然后一次查看上图中所有消耗内存的代码。


例子用的是瀑布流,如果需要的可以去这里下载:瀑布流下载

以上这些都是我自己总结出来的,也许不对的地方,如果发现不对的地方请指出,谢谢。


这篇关于【iOS开发】---- 使用Instrument检查内存占用过多的代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/571053

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof