在 Android 上,Square 这家公司提供了非常有名的工具: leakcanary ,来帮助开发者们在日常开发过程中就能够发现内存泄漏。但在 iOS 上呢?在 Google 的时候,我发现了两个工具,一个是这篇文章将要翻译并介绍的 Facebook 开源的三件套,另一个则是国内微信阅读团队做的 MLeaksFinder 。

关于 MLeaksFinder 这里有两篇其官方提供的文章介绍:

简而言之,MLeaksFinder 使用了一个非常 tricky 的方法来检测内存泄漏:通常一个 UIViewController 在被 pop 之后将会很快被释放,假设在 pop 3 秒钟之后仍然没有被释放,则可以认为这个 UIViewController 存在泄漏的问题(其实类似的方案同样也可以在 Android 上实现,据我所知微信在早期就有类似原理实现的用在 Android 上的内存泄漏监测工具了)。在后续的更新版本中,MLeaksFinder 也依赖了 Facebook 的 FBRetainCycleDetector 来辅助判断内存泄漏是否是由循环引用引起的。

MLeaksFinder 的原理非常简单但有效,帮助我排查了 App 中存在的不少内存泄漏问题,而且对于整个应用基本零侵入,不需要做任何的配置与修改。不过缺点也在这里,因为如果要将其作为日常自动化的工具使用的话,我希望 MLeaksFinder 本身可以提供回调接口,以便在内存泄漏发生时我可以选择是弹出 Alert 提示开发者,还是通过后台上报的方式提交。当然,开源的好处在于可以修改源码满足自己的需求,后续也会向其提交 PR,完善这个非常精巧的项目。

 

Facebook 的工程师们其实早就已经将 iOS 的内存泄漏排查自动化了,并发布了一篇非常不错的文章来介绍其原理,以及开源了他们的三个工具套件。为了加深对 Objective-C 内存管理的理解以及对库的原理的了解,在文末,会有我对这全篇英文文章的翻译。

对于工程师而言,自动化的工具真的是排名前几的生产力。

如果不想看翻译的话,这里也提供一个大概的全文重点概览:

  • 三个开源工具:

    • FBRetainCycleDetector

      • 主要用于检测循环引用
    • FBAllocationTracker
      • 主要用于快速检测潜在的内存泄漏对象,并提供给 FBRetainCycleDetector 进行检测
    • FBMemoryProfiler
      • 可视化工具,直接嵌入到 App 中,可以起到在 App 中直接查看内存使用情况,并筛选潜在泄漏对象的作用
  • Facebook 的自动化:客户端自动监测 -> 上报服务端 -> 归类/筛选 -> 分发给指定人员 -> 处理内存泄漏
  • 未开源的部分在于服务端如何对上报的循环引用链进行归类与筛选,不过 Facebook 的工程师们在文中给出了他们自己的策略

https://www.ctolib.com/topics-104295.html

iOS 内存泄漏监测自动化的更多相关文章

  1. 内存泄漏监测-LeakCanary

    内存泄漏监测方法之使用LeakCanary LeakCanary出处: github:https://github.com/square/leakcanary/issues square 公司 这个公 ...

  2. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug

    前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...

  3. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self

    前言: 在处理完框架内存泄漏的问题后,见上篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug 发现业务代码有一个地方的内存没释放,原因很也简单: ...

  4. LeakCanary 内存泄漏 监测 性能优化 简介 原理 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. iOS内存泄漏自动检测工具PLeakSniffer

    新款objective-C内存泄漏自动检测工具 PLeakSniffer , GitHub地址 (https://github.com/music4kid/PLeakSniffer). 背景 前些天读 ...

  6. 使用Xcode和Instruments调试解决iOS内存泄漏

    尽管iOS 5.0加入版本号之后ARC机制,由于相互引用关系是复杂的.内存泄漏可能仍然存在.于是,懂原理是非常重要的. 这里讲述在没有ARC的情况下,怎样使用Instruments来查找程序中的内存泄 ...

  7. iOS 内存泄漏

      我一直以为现在都是自动内存管理了,还哪有什么内存泄漏啊.一检测才知道,不是我太相信Xcode了,就是我太单纯了.iOS开发中遇到的内存泄漏主要有几下几种: (1)对象不能释放.使用Core Fou ...

  8. iOS 内存泄漏排查以及处理

    使用Xcode7的Instruments检测解决iOS内存泄露   文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0作为一名iOS开发攻城 ...

  9. 经验之道:最有效的iOS内存泄漏检测

    版权声明:本文由胡涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/125 来源:腾云阁 https://www.qclou ...

随机推荐

  1. 事件绑定的快捷方式 利on进行事件绑定的几种情况

    [事件绑定快捷方式]$("button:first").click(function(){ alert(1); }); [使用on绑定事件] ① 使用on进行单事件绑定 $(&qu ...

  2. SQL Server 导入excel时“该值违反了该列的完整性约束”错误

    SQL Server 导入excel时“该值违反了该列的完整性约束”错误 这个问题看似高大上,仔细分析了一下,ID列怎么会有重复呢? 原来是有很多空行呀!!! 所以导入excel时一定要注意空行的问题 ...

  3. excel 工作表如何插入当前日期时间

    在EXCEL表格中,插入当前的日期或是插入当前的时间:我们都可以用快捷键或时间函数来实现 插入当前日期 快捷键方法: 比如,显示日期的单元格为A1单元格: 今天是2018年6月8日: 鼠标点一下A1单 ...

  4. 优化SQLServer

    由于SQLServer,数据文件mdf过大,造成系统异常卡 一. 更改隔离级别 ALTER DATABASE [B2EC] SET SINGLE_USER WITH ROLLBACK IMMEDIAT ...

  5. 字符串数组中含有json转换

    [{'a':'1','b':'2'},{'c':'3','d':'4'}]" 解决 import net.sf.json.JSONArray; import net.sf.json.JSON ...

  6. poj 2002 Squares 几何二分 || 哈希

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 5749 Descript ...

  7. jdk锁相关

    锁类型 可重入锁:在执行对象中所有同步方法不用再次获得锁 可中断锁:在等待获取锁过程中可中断 公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利 读写锁:对资源读取和写入的 ...

  8. laravel开发之-安装laravel-admin

    1.输入命令:composer require encore/laravel-admin "1.4.*" 2.在config/app.php中添加 :Encore\Admin\Pr ...

  9. Cloudera Manager5及CDH5在线(cloudera-manager-installer.bin)安装详细文档

    问题导读:1.Cloudera Manager5如何使用cloudera-manager-installer.bin安装?2.Cloudera Manager5安装被中断该如何继续安装?还是重新安装? ...

  10. Android GridView显示SD卡的图片

    GridView的XML布局: main.xml: <GridViewxmlns:android="http://schemas.android.com/apk/res/android ...