XCode提供了一组用于检测内存,调试动画,布局等的工具。对于调试一些性能问题,内存问题非常方便。这里我们使用Leak来发现代码中的内存泄露。

在Leak中启动我们的应用开始监控:

注意,在监控的时候有两种选择:All Heap Allocation,All Heap Allocation & Anonymous VM.这里我们只需要关心All Heap Allocation。因为这才是我们App真实使用的内存。Anonymous VM是操作系统在我们App启动的时候为进程预留的内存空间。它一般是大于App实际需要的内存大小的。并且这个大小我们也控制不了,因此监控没有意义。

Focus on the heap allocations because your app has more control over heap allocations. Most of the memory allocations your app makes are heap allocations.

The VM in anonymous VM stands for virtual memory. When your app launches, the operating system reserves a block of virtual memory for your application. This block is usually much larger than the amount of memory your app needs. When your app allocates memory, the operating system allocates the memory from the block it reserved.

Remember the second sentence in the previous paragraph. The operating system determines the size of the virtual memory block, not your app. That’s why you should focus on the heap allocations instead of anonymous VM. Your app has no control over the size of the anonymous VM.

Source: http://meandmark.com/blog/2014/01/instruments-heap-allocations-and-anonymous-vm/

上面图中Instrument已经自动给我们标识出了一些有泄露的地方Leak Check那一栏中打红叉的位置。但是很多泄露还是发现不了。这些泄露需要借助下面所说的方法手工找出。

对当前分配内存做标记

我们可以通过Mark Generation来对当前内存做标记,每次标记Instrument会统计上次标记后新申请的内存,并会跟踪这些内存的使用(是否释放)。

通过这个功能,我们就可以检测某些页面中存在的内存泄露情况。方法就是:

1. 在进入某页面前,将内存做标记

2. 进入页面,待内存稳定后,再次将内存做标记,这是标记列表中的对象都是当前页面所创建的。Instrument当然也会跟踪这些对象。

3. 在页面中做些操作,然后退出页面。这是上一步中标记下来的应该大部分都会释放掉。剩下来的我们需要检查一下是否存在应该释放但是没有释放的。像一些UI元素如果界面退出还没有释放,说明存在内存泄露。下图就是某个页面退出后我对该页面创建时的内存标记:

通过点击上面列表的每一个实例,我们可以看到每个实例完整的引用计数修改记录。如果是在我们写的代码中发生修改的话,我们还能看到代码。这样方便我们找出导致泄露的根源。

上面的引用计数改变列表中,我们需要找出那种+1之后没有-1的记录(一般都是我们自己写的代码),然后找到对应的代码。我这里找的方法是:把这个列表拷贝到excel中,然后把所有非app代码的记录去掉,这样找会容易找到一点。(不知道为什么这里Instrument不提供筛选功能,不然会方便很多)

利用Instrument Leak来发现App中的内存泄露的更多相关文章

  1. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  2. LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  3. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  4. Java中的内存泄露 和 JVM GC(垃圾回收机制)

    一.什么是Java中的内存泄露? 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点, 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连:其次,这些对象是无用的,即程序以 ...

  5. iOS利用HealthKit框架从健康app中获取步数信息

    微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...

  6. macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号

    一.使用流程 Windows下的程序运行崩溃时,往往可以利用pdb文件快速解析出程序崩溃的具体位置,甚至可以对应到源代码的具体行数.macOS下的symbolicatecrash也具备相应的功能.对应 ...

  7. 如何快速排查解决Android中的内存泄露问题

    概述 内存泄露是Android开发中比较常见的问题,一旦发生会导致大量内存空间得不到释放,可用内存急剧减少,导致运行卡顿,部分功能不可用甚至引发应用crash.对于复杂度比较高.多人协同开发的项目来讲 ...

  8. 使用Visual Leak Detector for Visual C++ 捕捉内存泄露

    什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...

  9. Qt应用中检测内存泄露——VLD

    本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...

随机推荐

  1. table 转实体

    public class Table2Entity<T> where T : class,new() { public static List<T> GetEntitys(Da ...

  2. Linux文件在系统中传输

    一.文件的传输 1.命令:scp scp file user@ip:/dir ##把当前系统目录下的文件file复制到另一个系统目录下 scp user@ip:/file dir 2.命令:rsync ...

  3. 【dlbook】正则化

    对学习算法的修改——旨在减少泛化误差而不是训练误差 显著减少方差而不过度增加偏差. [参数范数惩罚] 通常只对权重做惩罚而不对偏置做惩罚,原因是拟合偏置比拟合权重容易很多. 不同层使用不同惩罚的代价很 ...

  4. Lodash 浓缩

    Lodash 是个十分有用的工具库,但我们往往只需要其中的一小部分函数.这时,整个 lodash 库就显得十分庞大,我们需要减小 lodash 的体积. cherry-pick 方法 Lodash 官 ...

  5. geotools中泰森多边形的生成

    概述 本文讲述如何在geotools中生成泰森多边形,并shp输出. 泰森多边形 1.定义 泰森多边形又叫冯洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是由一组由连 ...

  6. Android中破解应用签名校验的后续问题处理方案(闪退和重启现象以及无效问题)

    一.前言 之前已经写了一个爆破签名校验的工具kstools,很多同学也在使用,但是也反馈了不少问题,之前一篇文章也介绍了,关于爆破之后第三方登录问题修复,这篇我们在综合说明一下一些后遗症问题,关于ks ...

  7. Java面试题收集以及参考答案(100道)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  8. manacher 算法 这个人确实写得太好了;

    O(n)回文子串(Manacher)算法 资料来源网络 参见:http://www.felix021.com/blog/read.php?2040 问题描述: 输入一个字符串,求出其中最大的回文子串. ...

  9. Linux OpenCV 静态链接错误

    错误一: undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' ...

  10. [译]HIPAA要求的SSL/TLS等级

    原文链接:https://luxsci.com/blog/level-ssl-tls-required-hipaa.html 原文发表时间:2015.1.13 本博文仅仅是上述原文的翻译,仅供研究参考 ...