【问题标题】:Why the huge difference between XCode & instruments memory usage, and is it ok?为什么 XCode 和仪器内存使用之间存在巨大差异,可以吗?
【发布时间】:2015-12-25 16:14:31
【问题描述】:

我将 XCode 7.0 与 iOS 9.0 SDK 和 ARC 一起使用,所有分析/测试都在装有 iOS 9 的 iPhone 5S 上完成。编辑:对于所有屏幕截图,这是一次运行:我跑了直接从 xcode 构建调试,然后手动将 Instruments 附加到它。因此,屏幕截图都来自完全相同的单次测试运行。这种内存增长(每个 xcode 视图)是 100% 可重现的。

我的应用程序会下载 ZIP 文件、解压缩它们并将它们添加到相机胶卷中。我确保分析和捕获内存泄漏(即缺少 CGContextRelease)以及使用 @autoreleasepool

在解压缩过程中,在 xcode 中,我看到内存使用量迅速上升,直到解压缩完成,我无法解释这一点,因为 Instruments 中没有我可以看到的对象被抓住。内存永远不会被释放(根据 xcode 的内存视图)。在我的测试运行结束时,我看到使用了 236MB,解压缩过程中没有内存警告。如果我使用 Instruments 的分配工具,我会看到使用了 50.2MB 的堆和匿名 VM。这是一个巨大的差异!

我做的第一件事是假设 [UIImage imageNamed: 是罪魁祸首(缓存等),因为我有很多动画 UIImageViews,所以我花时间从我的代码中删除所有 imageNamed,并改用 imageWithContentsOfFile。那根本没有帮助。我使用 iOS 8 Photo 框架将解压缩的图像添加到相机胶卷中,如下所示:[PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:[NSURL fileURLWithPath:filePath]]

我花了相当多的时间翻阅 Instruments 和网络文章,但无济于事。谁能回答这些问题?

  1. 为什么 xcode 内存使用和 Instruments 之间存在差异 - 这是正常的吗?
  2. 我认为这些数字对于发布这样的应用来说太高了,我必须在上传到应用商店之前改进这一点,对吧?
  3. 看看下面的屏幕截图,您能提出任何建议吗?我可以从哪里开始寻找问题?

非常感谢您的帮助。当然我会发布任何有帮助的源代码,我只是不确定从哪里开始......

XCODE 内存使用量 236 MB

乐器

【问题讨论】:

  • 只有 Instruments 才能为您提供可使用的数字。 Instruments 是您应该用来查找泄漏和总体内存使用情况的唯一工具。 50MB 听起来不是问题...
  • 真的吗?所以可以忽略庞大的 236MB 数字并假装它不存在吗?我有点害怕这样做,感觉就像把它扫到地毯下;)
  • “我直接从 xcode 运行了一个调试版本,然后手动将 Instruments 附加到它”这就是问题所在。
  • 当我在 Instruments 端将 Instruments 附加到发布版本时,情况看起来并没有太大不同。我没想到在 xcode/instruments 之间存在 >100MB 的内存使用差异是可以的
  • 您的分配看起来不错。我读到您只能真正控制 All Heap Allocations 下显示的内存,并且您无法直接控制 All Anonymous VM 下显示的内容。我发现您的问题是在寻找有关我的匿名 VM 为何在 iOS9 上大放异彩的信息。和你一样,我的匿名 VM 对象数量非常少,占我内存使用量的 90%,我想将其减少。

标签: ios iphone xcode cocoa-touch


【解决方案1】:

最常见的原因是您的配置。默认情况下,当您在 Xcode 中运行时,您会在调试模式下构建。当您在 Instruments 中配置文件时,默认情况下,它会构建 Release。您可以在您的方案中修改您的运行和配置文件配置来改变这一点。

【讨论】:

  • 嗨 Rob,我将更新我上面的问题:在这种情况下,我使用调试配置和手动附加仪器构建
  • ... 抱歉,我应该在上一条评论中问:您的意思是 Instruments 应该在 Release 版本上运行吗?我以为我应该在调试版本上运行 Instruments。
  • 通常您在发布版本上运行 Instruments,因为这就是您要发布的内容。优化可以极大地影响性能,因此 CPU 分析(这是 Instruments 的一个非常常见的用途)在 Release 中是非常无用的。内存使用通常不会发生如此显着的变化。
猜你喜欢
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2014-08-31
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多