在Instruments.app中,“Leaks”和“Allocations> #Living”之间有什么区别?

时间:2014-02-17 13:58:55

标签: xcode macos memory-management xcode5 instruments

我想知道Xcode 5的Instruments.app中显示的“Leaks”和“Allocations> #Living”之间的区别是什么。我使用iprofiler命令检查使用Clang ++构建的C ++命令行应用程序的内存泄漏,并使用Instrunents.app打开.dtps文件。

$ iprofiler -leaks ./a.out
$ open a.dtps

正如您在附带的屏幕截图中看到的那样,存在166.61 MB的大容量内存。 Apple解释说“#Living”是“在所选时间范围内创建的分配数量,并且仍然存在于其末尾”。听起来“#Living”表示内存泄漏量。

但我没有在应用程序窗口的“泄漏”选项卡中看到此“泄漏”。 “泄漏”和“#Living”之间有什么区别?

Screen shot of Instruments.app

2 个答案:

答案 0 :(得分:2)

已分配且仍然存在的对象是那些仍然被应用程序使用并且引用被保留的对象。使用此编号,您可以识别仍然保留的对象,从而耗尽内存。分配分析可帮助您改善内存使用问题。他们并没有泄露暴徒,但仍被引用。

泄漏是您的应用中不再引用和访问的对象。所以对象,从未分别被释放或释放。

答案 1 :(得分:0)

感谢罗布(Rob)在对此question的评论中指出,我发现了这个WWDC 2012: iOS App performance: Memory; Minute 30。确保您完整地看到了问题和WWDC视频。

简而言之,内存增长的发生可能有以下三个原因:

enter image description here

分配是一个更广泛的术语。

  • 泄漏可能类似于带有闭包的泄漏,具有参考周期的委托。 分配泄漏都可以帮助您确定这一点。
  • 放弃内存“是由于来自持久对象的强大指针,这些持久对象在我们的应用运行时不会被释放”。就像一个类,其中的计时器由RunLoop强烈指向,或者DispatchSourceTimer由GCD强烈指向,等等。有关更多信息,请参见here分配将帮助您识别这一点。 泄漏无法检测到。
  • 缓存的内存:这是一个有趣的情况。这不是编程错误。简而言之,这只是一个错误。假设您缓存不需要的图像,例如您会缓存去年的所有照片,而90%的用户仅关注上个月的照片。分配将帮助您可视化内存增长。泄漏不会。因为这不是泄漏。从技术上讲,您可以编写一个泄漏为0的应用程序,但该应用程序可以缓存所有内容并消耗10 GB的数据。用户会为此而讨厌您!

您真的需要了解:

当有两个(或多个)对象之间只有强引用时,会产生强引用周期(也称为泄漏)警告。废弃的内存或缓存的内存都不是!