1

我的一个应用程序需要释放非活动/使用/有线内存的功能,就像命令“清除”一样。检查和谷歌很多,但不能得到任何命中

欢迎任何评论

4

2 回答 2

2

Purge 不会像您认为的那样做。它不会“释放非活动/使用/有线内存”。正如手册页所说:

它不影响通过 malloc、vm_allocate 等分配的匿名内存。

它所做的只是清除磁盘缓存。这仅在您正在运行性能测试并且想要模拟“冷启动后首次运行”的效果而不实际冷启动时才有用。同样,从手册页:

清除可用于使用冷磁盘缓冲区缓存近似初始引导条件,以进行性能分析。

对此没有公共 API,尽管对符号的快速扫描表明它似乎从 CoreProfile 私有框架调用了函数 CPOSXPurgeAllDiskBuffers。我相信底层内核和用户态磁盘缓存代码全部或大部分都可以在http://www.opensource.apple.com上找到,所以如果你真的想要的话,你可以自己实现同样的事情。

正如 iMysak 所说,如果您愿意,您可以只执行(或 NSTask 等)该工具。

附带说明一下,您可以释放已使用/已连接的内存,大概该内存已被某些东西使用-即使您在自己的数据结构中没有指向它的指针, malloc 也可能有。您是否正在尝试对代码进行分段错误?

释放不活跃的记忆是另一回事。只是将某些东西释放到 malloc 并不一定会使 malloc 将其返回给操作系统。而且你没有办法强迫它。如果您考虑一下传统 UNIX 的工作方式,那是有道理的:当您要求它分配更多内存时,它使用 sbrk 来扩展您的数据段;如果你在顶部释放内存,它可以 sbrk 回落,但如果你在中间释放内存,它就无法做到这一点。当然,现代 UNIX 系统不是这样工作的,但是 POSIX 和 C API 都被设计成与这样的系统兼容。所以,如果你想确保内存被释放,你必须直接处理内存分配。

最简单和最便携的方法是创建和映射一个临时备份文件,或者只是 MAP_ANON,并在完成后显式取消映射页面。(这适用于所有 POSIX 系统,并且使用非常简单的包装器,甚至 Windows。)如果您需要更多控制(例如,手动处理将页面刷新到磁盘等),您可以使用 mach/mach_vm.h蜜蜂。

于 2012-07-10T17:59:33.650 回答
0

您可以直接从操作系统运行它 // 使用 exec() 函数

于 2012-07-10T14:17:22.130 回答