实际/驻留内存大于XCode Instruments报告的分配

时间:2012-09-09 16:47:59

标签: macos cocoa memory-management xcode-instruments

我有点失落。我正在写一个小应用程序,它在第一步加载一堆数据并将它们放入数据库。

对于数据库中的每个条目,我创建一个新对象,希望从弧中释放:-)。

仪器工具向我显示我的应用程序实际上有5-6 MB的生活分配。但是活动监视器说我实际上正在使用100 mb的'physikal'(Real)内存?

如何减少100 mb?你看到的内存泄漏只有100 kb,这不是原因!?

仪器显示5.67Mb'Live'

Instruments

活动监视器显示98Mb实内存

Activity Monitor

1 个答案:

答案 0 :(得分:4)

简短回答是 - 不要担心 - 100Mb不是很多

你需要知道的主要事情是'Real'或 Resident RAM与分配的RAM完全不同。如果你分配了大量的RAM,它们就可以联系起来,但你没有。

为什么不一样?

  • 取消分配(或垃圾收集)RAM通常不会返回给操作系统,所以仍然可以暂时“驻留”。

    这很可能是你案件中的罪魁祸首 - 在分配了大量内存(1Gb暂时性)中加载数据库一段时间,然后解除分配,留下了大量的RAM居住在你的过程中。

    请注意,在垃圾收集(包括 ARC )中,为对象分配的内存空间可以比它曾经拥有的对象存活更长时间 - 例如如果你分配并立即释放10000个1K对象,你可能会发现你的真实RAM必须增加10Mb,即使在任何时候只使用了1K的数据。这是因为垃圾收集推迟到程序运行循环的特殊清理阶段。

  • 只能在4Kb页面中请求驻留RAM,这意味着即使对于1字节分配,也可以分配4Kb驻留RAM。通常,malloc会尝试在同一个4k页面上放置多个分配,但由于碎片,您会看到一些损失。

  • 当前未使用的已分配RAM可以分页到磁盘,因此不再驻留

  • 该应用程序包含一些(可能是很多)内存,而这些内存未被malloc“分配”,其中包括:

    • 应用程序二进制文件 - 代码和数据
    • 应用程序库 - 在私有或共享RAM中
    • 堆栈
    • 其他共享内存
    • 可能是图形区域(例如X11),打开文件缓冲区和mmaps(取决于我们认为'已分配'。

    • 用于台式机或笔记本电脑;对于嵌入式设备来说,这是一个很大的问题,对于手机或平板电脑来说,它取决于它。