Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发中内存泄漏检测工具--MLeaksFinder

iOS开发中内存泄漏检测工具--MLeaksFinder

作者头像
用户1451823
发布于 2018-09-13 07:40:04
发布于 2018-09-13 07:40:04
2.5K0
举报
文章被收录于专栏:DannyHoo的专栏DannyHoo的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337757

iOS 开发过程中我们有时会遇到内存泄漏的问题,我们也会对内存泄漏进行监测,如苹果自带的Instrument。我们会使用Instrument中的Leaks/Allocations对内存泄漏进行监测,但在使用过程中却会存在各种问题以及不便。

leaks的问题:

其中 Leaked memory 和 Abandoned memory 都属于应该释放而没释放的内存,都是内存泄露,而 Leaks 工具只负责检测 Leaked memory,而不管 Abandoned memory。在 MRC 时代 Leaked memory 很常见,因为很容易忘了调用 release,但在 ARC 时代更常见的内存泄露是循环引用导致的 Abandoned memory,Leaks 工具查不出这类内存泄露,应用有限。

Allocations的问题:

对于 Abandoned memory,可以用 Instrument 的 Allocations 检测出来。检测方法是用 Mark Generation 的方式,当你每次点击 Mark Generation 时,Allocations 会生成当前 App 的内存快照,而且 Allocations 会记录从上回内存快照到这次内存快照这个时间段内,新分配的内存信息。举一个最简单的例子:

我们可以不断重复 push 和 pop 同一个 UIViewController,理论上来说,push 之前跟 pop 之后,app 会回到相同的状态。因此,在 push 过程中新分配的内存,在 pop 之后应该被 dealloc 掉,除了前几次 push 可能有预热数据和 cache 数据的情况。如果在数次 push 跟 pop 之后,内存还不断增长,则有内存泄露。因此,我们在每回 push 之前跟 pop 之后,都 Mark Generation 一下,以此观察内存是不是无限制增长。这个方法在 WWDC 的视频里: Session 311 - Advanced Memory Analysis with Instruments ,以及苹果的开发者文档: Finding Abandoned Memory 里有介绍。

用这种方法来发现内存泄露还是很不方便的:

首先,你得打开 Allocations

其次,你得一个个场景去重复的操作

无法及时得知泄露,得专门做一遍上述操作,十分繁琐

之前在项目中就使用了一个更好的监测内存泄漏的工具,可一直没有记录下来,这次有时间就赶紧记录在此。这个工具的名字是MLeaksFinder。先附上MLeaksFinder的下载地址:https://github.com/Zepo/MLeaksFinder

我们只要将MLeaksFinder导入到项目中就能监测项目中的内存泄漏的代码了,而无需我们做更多的操作。MLeaksFinder只在debug模式下有效,而不会影响我们的release包。当程序出现内存泄漏,会弹出一个内存泄漏的提示框,并显示是谁发生了内存泄漏,如图所示:

这样我们就能很快地定位到内存泄漏的页面了。

MLeaksFinder的原理:

MLeaksFinder一开始是从UIViewController入手的,UIViewController在POP或dismiss之后该控制器及其上的view,view的subviews都会被释放掉,MleaksFinder就是在控制器POP或dismiss之后去查看该控制器和其上的view是否都被释放掉。

具体的方法是,为基类 NSObject 添加一个方法 -willDealloc 方法,该方法的作用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言。这样,当我们认为某个对象应该要被释放了,在释放前调用这个方法,如果3秒后它被释放成功,weakSelf 就指向 nil,不会调用到 -assertNotDealloc 方法,也就不会中断言,如果它没被释放(泄露了),-assertNotDealloc 就会被调用中断言。这样,当一个 UIViewController 被 pop 或 dismiss 时(我们认为它应该要被释放了),我们遍历该 UIViewController 上的所有 view,依次调 -willDealloc,若3秒后没被释放,就会中断言。

简而言之就是当一个对象3秒之后还没释放,那么指向它的 weak 指针还是存在的,所以可以调用其 runtime 绑定的方法 willDealloc 从而提示内存泄漏。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年06月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS_Memory Leak 内存泄露治理
Leaked memory 和 Abandoned memory 都是应该释放而没释放的内存,属于内存泄露。
mikimo
2023/10/18
1K0
iOS_Memory Leak 内存泄露治理
打造自己的内存泄漏检测工具
我们在编写日常业务代码时,或多或少都会引入一些导致内存泄漏的代码,而这种行为又很难被监控,这就导致应用内存泄漏的口子越开越大,直接影响到线上应用的稳定性。虽然 Xcode 的 Instrucment 提供了 Leaks 和 Allocations 工具让我们能精准地定位内存泄漏问题,但是这种方式相对比较繁琐,需要开发人员频繁地去操作应用界面,以触发泄漏场景,所以 Leaks 和 Allocations 更加适合定期组织的大排查,作为监测手段,则显得笨重。
Swift社区
2021/11/26
1.1K0
打造自己的内存泄漏检测工具
利用 Xcode 内存表(Debug Memory Graph)检测内测泄漏
Debug Memory Graph 前言 平常我们都会用 Instrument 的 Leaks / Allocations 或其他一些开源库进行内存泄露的排查,但它们都存在各种问题和不便, 在这
BY
2018/05/11
4.6K0
iOS学习——内存泄漏检查及原因分析
项目的代码很多,前两天老大突然跟我说项目中某一个ViewController的dealloc()方法没有被调用,存在内存泄漏问题,需要排查原因,解决内存泄漏问题。由于刚加入项目组不久,对出问题的模块的代码还不太熟悉,所以刚拿到问题时觉得很棘手,再加上作为一个iOS菜鸟,对内存泄漏的排查方法和原因确实基本上不了解。所以,也借着这样的机会,我研究了一下关于iOS开发中内存泄漏的排查方法和原因分析。   首先,补充两个基本概念的解释: 内存溢出 (out of memory):是指程序在申请内存时,没有足够的内
mukekeheart
2018/03/01
2.1K0
iOS学习——内存泄漏检查及原因分析
腾讯开源 iOS 内存监控组件和OOM检测工具
自阿里巴巴开源Android检测内存泄露工具LeakCanary后,腾讯开源了一个在iOS 内存监控组件和一个OOM检测工具。
开发者技术前线
2020/11/23
3.4K0
腾讯开源 iOS 内存监控组件和OOM检测工具
为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
LeakCanary 是我们非常熟悉内存泄漏检测工具,它能够帮助开发者非常高效便捷地检测 Android 中常见的内存泄漏。在各大厂自研的内存泄漏检测框架(如腾讯 Matrix 和快手 Koom)的帮助文档中,也会引述 LeakCanary 原理分析。
用户9995743
2022/09/26
1.2K0
为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类
本文介绍了如何使用 Aspects 库实现 iOS 内的内存泄漏检测,通过结合 YFMemoryLeakDetector 工具类,可以更加快速、精准地检测出内存泄露问题,从而帮助开发人员提前发现并修复问题,提高程序的稳定性和可维护性。
ios122
2018/01/02
1.4K0
内存泄漏检测工具
内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。
阳光岛主
2019/02/19
7.8K0
Android内存泄漏监控和优化技巧总结
前言 对于Android平台的应用程序来说,内存优化一直是个热门话题,与传统PC应用程序不同,Android上的应用一旦出现各种异常时系统默认会以最严厉的“崩溃”方式反馈给用户,如果处理不当,将严重影响用户体验。 丛所周之,移动设备的软硬件资源无法与传统PC相提并论(至少目前是这样),因而开发人员在编写应用时,需要有更多技巧、更精深的技术来应对各种局面。这其中尤以内存OOM(内存溢出)等涉及内存泄漏这样的问题最为常见。 本文着重总结降低应用内存占用的技巧以及对应的解决方案。 先来谈谈内存泄漏的监控机
用户1263954
2018/06/22
2.6K0
VLD内存泄漏检测工具
在main.cpp中添加#include <vld.h>后以调试模式运行即可检测内存泄漏。
Qt君
2020/05/14
1.5K0
(译)Profile Your App’s Memory Usage
不论何时,只要app创造对象,内存就会为它分配一块空间,通常情况下,app需要跟踪这些创建的对象,并在不需要的时候释放它们,好让内存可以为其他的对象分配空间。而ARC可以让系统自动管理这些内存,可以使工作变得更简单,通过ARC,系统能够监控对象的创建,并在合适的时候释放,从而留给app很少的事情去做。但不论多少内存被管理,即使是最好的app设计也会偶尔碰到一些很难以解决的内存问题。
粲然忧生
2024/04/24
2400
程序员面试闪充 -- 性能优化
CPU 和GPU 关于绘图和动画有两种处理方式CPU(中央处理器)和GPU(图形处理器),CPU的工作都在软件层面,而GPU的在硬件层面。 总的来说,可以使用CPU做任何事情,但是对于图像的处理,通常GPU会更快,因为GPU使用图像对高度并行的浮点运算做了优化,所以,我们想尽可能的把屏幕渲染的工作交给硬件去处理,而问题在于GPU并没有无限制处理的性能,一旦资源用尽,即使CPU并没有完全占用,GPU性能还是会下降。 所以,目前大多的性能优化都是关于智能利用GPU和CPU,平衡它们之间工作负载。 Xcode
谦谦君子修罗刀
2018/05/02
9730
程序员面试闪充 -- 性能优化
关于 循环引用问题
多个对象相互持有,A对象强引用B对象,同时B对象也强引用于A对象,两者相互等待对方发消息告诉自己需要Release,一直等待,形成闭环,内存无法释放,导致内存泄露。
honey缘木鱼
2019/12/20
3.4K0
关于 循环引用问题
Windows平台下的内存泄漏检测
在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏。 在windows平台下内存泄漏检测的原理大致如下。 1. 在分配内存的同时将内存块的信息保存到相应的结构中,标识为已分配 2. 当内存释放时在结构中查找,并将相应的标识设置为已释放 3. 在需要的位置调用HeapWalk,遍历整个堆内存,找到对应的内存块的首地址,并与定义的结构中的数据相匹配,根据结构中的标识判断是否释放,未释放的话给出相应的提示信息。 另外在VS系列的编译器中如果输出的调试信息的格式为:文件名(行号)双击这样的输出信息,会自动跳转到对应的位置,利用这点可以很容易的定位到未释放的内存的位置。 为了实现上述功能,我们使用重载new和delete的方式。下面是具体的代码:
Masimaro
2018/08/31
1.1K0
如何优雅地检测内存泄漏?
作者:jerrychu  腾讯PCG客户端开发工程师 |导语  内存优化一直是客户端性能优化的重要组成部分,内存泄漏又是内存问题的一大罪魁祸首。如何高效快速地检测并修复内存泄漏问题呢?本文介绍一种在开发阶段自动化检测页面级别内存泄漏问题的实践方案。 TL;DR 使用 MLeaksFinder 找到内存泄漏对象 使用 FBRetainCycleDetector 获取循环引用链 使用 自研工具 获取全局对象引用链 QNLeaksFinder 组件对以上功能进行了统一封装和接口优化,一行代码即可实现内存泄漏检测
腾讯大讲堂
2021/01/20
1.7K0
一个循环动画引起的内存泄露问题总结
本文主要记录项目中遇到的一个内存泄露问题:由于一个循环动画引起的内存泄露,并且这个问题也是偶现的,在后面的隐藏问题里会说明。
QQ音乐技术团队
2018/07/13
2.5K0
Android Native内存泄漏检测方案详解
一个完整的 Android Native 内存泄漏检测工具主要包含三部分:代理实现、堆栈回溯和缓存管理。代理实现是解决 Android 平台上接入问题的关键部分,堆栈回溯则是性能和稳定性的核心要素。
腾讯技术工程官方号
2024/07/03
9210
Android Native内存泄漏检测方案详解
lua内存泄漏检测工具原理及设计
Google一下“lua内存泄漏检测”,基本都是直接或间接指向云风多年前写的《一个 Lua 内存泄露检查工具》,其思路是给虚拟机做个快照,记录下所有gc对象地址及引用关系,然后通过对比两次快照来分析内存泄漏情况。文章似乎把内存泄漏等同于某个gc对象的新增了。
车雄生
2021/11/10
2.2K0
实践-做一个会性能调优的好猿
对于每位 iOS 开发者来说,代码性能是个避不开的话题。随着项目的扩大和功能的增多,没经过认真调试和优化的代码,要么任性地卡顿运行,要么低调地崩溃。一般性能测试都是从CPU、内存、响应时间(反应时间)来进行测试和以及后续优化的切入点。Xcode自帶的Instruments 提供了丰富的测试工程性能的工具,本文就为大家带来几个实用的工具使用。Apple关于Instuments的介绍
進无尽
2018/09/12
1.1K0
实践-做一个会性能调优的好猿
《iOS APP 性能检测》
| 导语 最近组里在做性能优化,既然要优化,就首先要有指标来描述性能水平,并且可以检测到这些指标,通过指标值的变化来看优化效果,于是笔者调研了iOS APP性能检测的一些方法,在此总结一下。 首先,要明确性能检测都需要关注哪些指标,笔者列举了以下几个主要的,后面会详细说: 启动时间 内存占用量,内存告警次数 CPU使用率 页面渲染时间,刷新帧率 网络请求时间,流量消耗 UI阻塞次数,不可操作时长,主线程阻塞超过400毫秒次数 耗电功率 对于静态页面来讲,页面的渲染时间就是从viewDidLoad第一行到vi
腾讯Bugly
2018/03/23
4.8K0
相关推荐
iOS_Memory Leak 内存泄露治理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档