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

时间:2014-10-16 22:06:18

标签: ios objective-c automatic-ref-counting instruments

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

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

所以我的问题是:

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

1 个答案:

答案 0 :(得分:1)

我会抓住你的问题:

  

这种行为表明了什么?我有记忆问题吗?是   哪里有某种类型的懒惰释放内存?

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

  

在海中   显示持久内存的迭代,一个零堆增长是什么   迭代意味着什么?

很难说。一个好的一阶猜测可能是与迭代相关的堆增长以某种方式完全被为前一次迭代分配的内存的延迟/延迟释放所抵消。

  

如果特定代的堆栈跟踪指向   只对系统库,这是否意味着堆增长   生成是有效还是有错误?或者它仍然意味着   我的记忆力有什么东西在我身上?

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

  

是什么   它意味着当堆栈跟踪显示您的库和方法时,但它是   像系统代码一样灰白,并且有一个小房子图标,而不是a   你的图书馆和方法是黑色的,有一点点   人形图标?

显示为灰色的行表示Instruments没有该行的调试符号。就这样。它没有说明有关内存使用的具体内容。

  

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

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