【问题标题】:Real/Resident memory larger than allocations reported by XCode Instruments实际/常驻内存大于 XCode Instruments 报告的分配
【发布时间】:2012-09-02 16:26:57
【问题描述】:

我有点迷路了。我正在编写一个小应用程序,它在第一步中加载了一堆数据并将这些数据放入数据库中。

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

仪器工具显示我的应用实际上有 5-6 mb 的生活分配。但是活动监视器说我实际上正在使用 100 mb 的“物理”(真实)内存?

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

仪器显示 5.67Mb 'Live'

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

【问题讨论】:

    标签: macos cocoa memory-management xcode-instruments


    【解决方案1】:

    简短的回答是——别担心——100Mb 不是很多

    您需要在这里了解的主要内容是“真实”或驻留 RAM 与分配的 RAM 完全不同。如果您分配大量 RAM,它们可能会链接,但您没有。

    为什么它们不一样?

    • 取消分配(或垃圾收集)的 RAM 通常不会返回给操作系统,因此仍可以“驻留”一段时间。

      这很可能是您的罪魁祸首 - 将数据库加载到分配的大量内存(1Gb 临时)中一段时间​​,然后释放它,留下大量 RAM驻留在您的流程中。

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

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

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

    • 应用程序包含一些(可能大量)未被 malloc“分配”的内存,这包括:

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

      • 适用于台式机或笔记本电脑;对于嵌入式设备来说很多,对于手机或平板电脑则取决于。

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 2013-11-04
      • 2011-11-06
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2011-11-02
      • 2013-09-08
      • 2010-11-06
      相关资源
      最近更新 更多