6

好的,这是我的问题,如果重复,我深表歉意。我搜索但找不到任何我认为相关的内容。

当我从 xcode 运行仪器并开始测试我的应用程序的内存泄漏或分配时,我的 iMac 最终开始运行非常非常缓慢。

这导致我在使用仪器时运行活动监视器,我注意到每隔一秒仪器打开它就会占用越来越多的实际内存。大约 100MB 每秒。

它很快就消耗了我所有的 iMac 可用内存 (2gbs),然后开始滞后。

无论如何,这不会发生在每个应用程序中。我对我下载的一些应用程序/项目进行了相同的测试,仪器似乎只使用了大约 250mbs 的空间并且没有显着增加。

有什么明显的我做错了吗?任何帮助,将不胜感激。

谢谢。

4

1 回答 1

5

仪器消耗大量内存。

根据您录制的内容,您可能会减少其内存使用量。例如,您通常可以指定要记录的内容(或不记录的内容),或降低采样频率(如果适用)。

100MB/s 异常高。您能否更准确地描述您当时正在录制的内容?(您使用的仪器,您记录的过程正在做什么等)。

Xcode 3 使用的内存要少得多——不确定 Instruments 是否也是如此。

您可以通过将工具集作为 32 位进程运行来稍微减少内存使用量。

最后,2GB 物理内存对于 Xcode + Instruments + iOS Sim 来说不算什么。fwiw,我经常用 8 GB 或更多 GB 耗尽物理内存。嘘。幸运的是,当您想要 4 或 8GB 时,内存很便宜。

更新

我尝试使用分配、泄漏和僵尸工具

如果必须,您可以单独运行这些测试。

分配

如果您的应用程序没有创建大量分配,则分配本身不应消耗大量内存。

要使用此仪器减少内存,您可以禁用一些您不感兴趣的选项:

  • 不记录每个 ref count 操作
  • 只跟踪活动分配
  • 禁用僵尸检测
  • 不识别 c++ 对象

泄漏

  • 仅当您想要泄漏历史记录时才暗示分配工具。

泄漏检测本身会消耗大量内存,因为它会扫描内存,基本上是克隆您的分配。假设您分配了 100MB - 泄漏会定期暂停进程,克隆内存并扫描它的模式。这可能会比您的应用程序消耗更多的内存。iirc,它在仪器中作为子进程执行。

僵尸

  • 意味着分配工具。

僵尸检测通常意味着参考计数记录。在调试僵尸时,永远不要释放它们是最有效的。如果你释放它们,你可能只会检测到短暂的僵尸(不确定仪器中是否有这样的选项......)。从不释放 objc 分配显然会消耗更多内存。在进程上运行泄漏将消耗更多内存,因为您的堆大小会更大 - 不应将泄漏和僵尸组合在一起。

您应该能够通过禁用其中一些选项并单独测试它们来减少总消耗。

笔记

  • 最前沿的开发者工具版本可能真的很不稳定。如果您遇到问题,坚持使用官方版本会有所帮助。
  • 我可以单独使用分配运行 osx 单元测试(主要是 c/c++ api),记录时消耗大约 1MB/s。似乎有些问题,但也许这表明您的程序中存在问题(许多临时分配?)。
  • 更改数据显示方式和/或充电/对焦设置可能需要大量内存。例如,“全部恢复”可能需要几 GB 来处理大样本。
  • if 100MB/s is an accurate number, i'd file a bug. I know Instruments consumes a lot of memory, but that's very high for recording an idle app, even with the expectation that instruments consumes a lot of memory.

good luck

于 2011-08-30T04:25:18.980 回答