【问题标题】:What is the difference between "Leaks" and "Allocations > # Living" in Instruments.app?Instruments.app 中的“Leaks”和“Allocations > # Living”有什么区别?
【发布时间】:2014-03-16 20:42:34
【问题描述】:

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

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

正如您在随附的屏幕截图中看到的那样,有一个 166.61 MB 的大型活动内存。苹果解释说,“# Living”是“在选定时间范围内创建并在其结束时仍然存在的分配数量”。听起来“# Living”表示内存泄漏量。

但我在应用程序窗口的“泄漏”选项卡中没有看到这个“泄漏”。 “泄漏”和“#生活”有什么区别?

【问题讨论】:

    标签: xcode macos memory-management xcode5 instruments


    【解决方案1】:

    感谢 Rob 在 question 的 cmets 中指出,我找到了 WWDC 2012: iOS App performance: Memory; Minute 30。确保您看到完整的问题和 WWDC 视频。

    简而言之,内存增长可能有 3 个原因:

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

    • 泄漏可以像带有闭包的泄漏,具有引用循环的委托。 AllocationsLeaks 都可以帮助您识别这一点。
    • 放弃内存“是由于来自持久对象的强指针在我们的应用程序运行时不会被释放”。就像一个类,它有一个被 RunLoop 强烈指向的计时器,或者一个被 GCD 强烈指向的 DispatchSourceTimer,等等。更多请参见 here分配将帮助您识别这一点。 泄漏无法检测到这一点。
    • 缓存内存:这是一个有趣的案例。这不是编程错误。简单地说,这只是一个错误。假设您缓存并不真正需要的图像,例如你缓存了去年的所有照片,而 90% 的用户只关心上个月的照片。分配将帮助您可视化内存增长。泄漏不会。因为它不是泄漏。从技术上讲,您可以编写一个 0 泄漏的应用程序,但是一个缓存所有内容并消耗 10 GB 的应用程序。用户会因此而讨厌你!

    你真的需要明白:

    当有两个(或更多对象)的唯一强引用在彼此之间时,会产生强引用循环(又名泄漏)警告。废弃的内存或缓存的内存都不是!

    【讨论】:

      【解决方案2】:

      已分配且仍处于活动状态的对象是那些仍被应用程序使用并保留引用的对象。使用这个数字,您可以识别您仍然持有的对象,从而耗尽内存。分配分析可帮助您改善内存使用问题。他们不是泄密的暴徒,但仍然被引用。

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

      【讨论】:

      • 谢谢@Volker。似乎“# Living”类似于 Valgrind 中的“仍然可达”。正如您所评论的,这意味着我不需要担心这一点。
      • 没错。我通常不会担心它们,但是如果您使用大量内存,则应该分析活动字节。您可能有机会减少内存占用。但是,不要进行过早的优化;)
      • 我正在阅读this 教程。而且我对您的回答仍然有些困惑,我应该使用哪个来查找内存泄漏,或者我应该同时使用两者?使用 Allocations,难道我不能通过查看对象 persist 来找出泄漏吗?...教程还说 Allocations 跟踪将在后面详细讨论; Leaks 轨道通常在 Objective-C 中更有用,并且不会在本教程中介绍。这让我更加困惑,因为我正在使用 Swift。
      • 我总是使用这两种工具来更好地了解我的内存管理和可能的问题。不管是 obj-c 还是 swift 代码。
      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多