仪器和堆增长,什么时候增长真的是泄漏?

dra*_*que 9 objective-c instruments ios automatic-ref-counting

我在设备上使用仪器试图弄清楚我是否有任何内存泄漏或被遗弃.具体来说,我正在使用泄漏和分配.虽然仪器没有指出任何泄漏,但这并不意味着我没有内存问题.几个星期以来,我一直在研究这个问题,而且我似乎没有更接近于弄清楚我有什么问题(呃).

我正在测试一个特定的动作,在动作后重新拍摄并重复.在最初的几个"稳定"世代之后,我可以看到增长和持久计数都从一定数量(几kb)开始.在经过多次重复迭代(比如说10-20)之后,一些(不是全部)慢慢地耗尽到0.它需要一段时间,但确实会发生.存在持久存储器的几代人实际上从未向我展示任何我认为有用的东西,因为堆栈跟踪显示了所有系统库.

所以我的问题是:

  1. 这种行为表明了什么?我有记忆问题吗?在某处有某种类型的懒惰释放内存吗?
  2. 在显示持久内存的迭代海洋中,一个零堆增长迭代意味着什么?
  3. 如果特定代的堆栈跟踪仅指向系统库,这是否意味着该代的堆增长是有效的还是存在错误?或者它仍然意味着我的记忆中有东西存在?
  4. 当堆栈跟踪显示您的库和方法时它意味着什么,但它像系统代码一样灰显,并且有一个小房子图标,与您的库和方法是一条黑线并且有一个小人物图标的线?
  5. 如果我有类似保留周期的东西 - 持续增长是否会保持一致?

任何洞察力的答案都会非常有帮助!

ipm*_*mcc 1

我来回答一下你的问题:

这种行为说明了什么?我的记忆力有问题吗?某处是否存在某种类型的延迟释放内存?

由于您无法知道系统框架如何管理其私有内存需求,因此您必须假设是的,每当您调用系统框架时都可能会发生延迟/延迟释放内存,这在大多数应用程序中是“始终” ”。除了无法排除这种可能性之外,我可以肯定地说,看似无害的系统框架使用肯定触发长期分配。(有关示例,请参阅此答案中有关 UIWebView 长期内存使用的讨论。)

在显示持久内存的大量迭代中,一次零堆增长迭代意味着什么?

很难说。一个好的一阶猜测可能是,与迭代相关的堆增长在某种程度上被为先前迭代分配的内存的惰性/延迟释放所抵消。

如果特定代的堆栈跟踪仅指向系统库,这是否意味着该代的堆增长有效或者存在错误?或者这是否仍然意味着有什么东西保留在我的记忆中?

如果 Instruments 显示堆增长,则该堆增长几乎肯定存在。堆的增长是否是您可以直接控制的取决于。如果您没有调用系统框架(不太可能),那么这绝对是您的错。一旦您调用系统框架,您就必须接受框架可能会分配在您的调用返回后仍保持分配状态的内存的可能性。

当堆栈跟踪显示您的库和方法,但它像系统代码一样呈灰色并有一个小房子图标,而您的库和方法的一条线是黑色且有一个小人图标时,这意味着什么?

灰色的行表示 Instruments 没有该行的调试符号。就这样。它没有指示任何有关内存使用的具体信息。

如果我有类似保留周期的东西 - 持续增长不是一致的吗?

如果每次迭代都创建一个具有循环保留的新对象图,那么是的,您会期望每次迭代都会导致堆增长至少与对象图的大小相同。也就是说,小对象图很容易在“噪音”中丢失。如果您有怀疑,一种方法是让“可疑”类的对象执行大量分配,这将使它们从“噪音”中脱颖而出。例如,malloc为每个实例设置一个兆字节(或更多)的对象(显然,在实例被释放时释放它。)这可以帮助问题区域突出到原来可能没有的地方。