首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放mem作为命令'purge‘的函数

释放mem作为命令'purge‘的函数
EN

Stack Overflow用户
提问于 2012-07-10 22:14:29
回答 2查看 284关注 0票数 1

我的一个应用需要释放非活动/已使用/有线内存的功能,就像命令“purge”一样。在谷歌上查了很多次,但都没有找到任何结果

欢迎您的评论

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-11 01:59:34

Purge并不像你所想的那样。它不会“释放非活动/已使用/有线内存”。正如手册页所说:

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

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

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

虽然对符号的快速扫描显示它似乎调用了CoreProfile私有框架中的函数CPOSXPurgeAllDiskBuffers,但没有用于此目的的公共API。我相信底层的内核和userland磁盘缓存代码都可以在http://www.opensource.apple.com上获得,所以如果你真的想要的话,你可以自己实现同样的事情。

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

顺便说一句,你可以释放已用内存/有线内存,假设内存是由某些东西使用的--即使你在自己的数据结构中没有指向它的指针,malloc也可能有。你是不是在试着分割你的代码?

释放非活动内存则是另一回事。仅仅将某些内容释放给malloc并不一定会让malloc将其返回给操作系统。你不可能强迫它这么做。如果您考虑一下传统UNIX的工作方式,就会发现这是有道理的:当您请求它分配更多内存时,它会使用sbrk来扩展您的数据段;如果您在顶部释放内存,它可以向下重新启动sbrk,但是如果您在中间释放内存,它就无法做到这一点。当然,现代的UNIX系统不是这样工作的,但是POSIX和APIs都被设计成与这样的系统兼容。所以,如果你想确保内存被释放,你必须直接处理内存分配。

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-10 22:17:22

您可以使用exec()函数直接从OS //运行它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11415252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档