我有点迷路了。我正在编写一个小应用程序,它在第一步中加载了一堆数据并将它们放入数据库中。
对于数据库中的每个条目,我都会创建一个新对象,希望从弧线中释放它:-)。
仪器工具显示我的应用程序实际上有 5-6 mb 的生活分配。但是活动监视器说我实际上正在使用 100 mb 的“物理”(真实)内存?
我怎样才能减少100 MB?您看到的内存泄漏只有 100 kb,这不是原因!?
我有点迷路了。我正在编写一个小应用程序,它在第一步中加载了一堆数据并将它们放入数据库中。
对于数据库中的每个条目,我都会创建一个新对象,希望从弧线中释放它:-)。
仪器工具显示我的应用程序实际上有 5-6 mb 的生活分配。但是活动监视器说我实际上正在使用 100 mb 的“物理”(真实)内存?
我怎样才能减少100 MB?您看到的内存泄漏只有 100 kb,这不是原因!?
简短的回答是——别担心——100Mb 并不多。
您需要在这里了解的主要内容是“真实”或常驻RAM 与分配的 RAM 完全不同。如果您分配大量 RAM,它们可能会链接,但您没有。
为什么他们不一样?
取消分配(或垃圾收集)的 RAM 通常不会返回给操作系统,因此仍然可以“驻留”一段时间。
在您的情况下,这很可能是罪魁祸首- 将数据库加载到分配的大量内存(1Gb 临时)中一段时间,然后释放它,在您的进程中留下大量 RAM。
请注意,在垃圾收集(包括ARC)中,为对象分配的内存空间可以比它曾经持有的对象存活更长的时间 - 例如,如果您分配并立即释放 10000 个 1K 对象,您可能会发现您的真实 RAM 必须增加 10Mb,甚至尽管在任何时候都只使用了 1K 的数据。这是因为垃圾收集被推迟到程序运行循环的特殊清理阶段。
驻留 RAM 只能在 4Kb 页面中请求,这意味着即使分配 1 字节,也可能分配多达 4Kb 的驻留 RAM。通常 malloc 会尝试在同一个 4k 页面上放置多个分配,但您会看到由于碎片而导致的一些损失。
分配的当前未使用的 RAM 可以分页到磁盘,因此不再驻留
该应用程序包括一些(可能很多)不是由 malloc“分配”的内存,这包括:
可能是图形区域(例如 X11)、打开的文件缓冲区和 mmap(取决于我们认为“分配”的内容。
适用于台式机或笔记本电脑;对于嵌入式设备来说很多,而对于手机或平板电脑则取决于。