使用仪器进行iOS开发的含糊之处

我正在用仪器分析一个应用程序。 分析是通过两种方式使用分配工具完成的:

  1. 当我运行应用程序进行性能分析时,通过直接select分配
  2. 通过select泄漏当我运行应用程序进行分析。

在这两种情况下,我都启用了分配工具进行testing。 但令人惊讶的是,在这些情况下,我有两种不同的分配方式。

他们应该有不同的performance吗? 或者这是仪器的问题。

我用泄漏工具剖析时间:

在分配图中: 在这里输入图像说明 1.我在Graph中获得了很多峰,实时字节和总体字节相同。 2.使用1分钟后,我得到黑旗(我认为它报警记忆警告)。 然后出现一组标志,我的应用程序崩溃。 (即使直接在设备中运行App,也会发生这种情况)

我用分配工具分析时间:

在分配图中: 在这里输入图像说明 我经常没有像上面这种情况那样高峰。 实时字节始终小于总体字节。 我已经用了20多分钟,从来没有黑旗。

我知道的一个事实是,当Live字节和总体字节相等时,NSZombieEnabled可以被启用。

你有没有遇到过这个问题。

更新1:

我遇到了第一个案件的另一个问题。 每当我简短的时间后分析(与第二种情况下的分析相比),该应用程序有很多的黑旗和我的应用程序崩溃。 (由于内存警告)

而当我尝试类似的一步一步使用应用程序我的应用程序没有崩溃,并没有标志。

为什么这种差异?

在第一种情况下,您只跟踪实时分配,因为“泄漏”模板以这种方式configuration了“分配”工具。 第二,你正在跟踪实时分配和释放分配。 (正如CocoaFu所说)。

两者都很有用,但原因稍有不同。

只有跟踪实时分配(通常结合Heapshot分析)才是分析应用程序中永久性堆增长的好方法。 一旦你知道什么是永远坚持,你可以找出原因,看看是否有办法优化它。

跟踪所有分配,活着和死亡,是跟踪分配带宽的一个非常有效的手段。 您可以按整个字节sorting,并从最大的#开始。 看看所有的分配点(点击所选行的分类标签旁边的小箭头),看看所有的分配来自哪里。

例如,您的图表显示,在该段时间内,有1427字节的分配 – 9218个分配。 所有的都已经free()d了,但是这仍然代表着一大堆工作要分配,填充数据(据推测),并且释放每一个。 这可能是一个问题,也许不是。

(从这个angular度来看,我使用这种技术来优化应用程序,仅仅关注减less短暂分配数量,我能够使应用程序的主要algorithm速度提高5倍,并减less内存使用到85%。原来这个应用程序正在复制很多次的string。)


不知道为什么你的应用程序崩溃,如你所描述的。 由于这是一个内存警告,你应该看看最经常分配的东西。

请记住,如果你有僵尸检测启用,这需要很多额外的内存。

根据分配实例的方式,有不同的选项。 通过单击“分配”磁贴中的“我”符号来检查选项。

是的,我也觉得这很烦人。