2012-07-10 48 views

回答

2

清除不做你仿佛运行认为它的确如此。它不会“释放不活动/使用/有线存储器”。如手册页说:

它不会影响已通过的malloc,vm_allocate分配的匿名内存等

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

清除可用于近似初始启动条件与冷磁盘缓冲区缓存进行性能分析。

虽然对符号进行了快速扫描,但似乎是从CoreProfile私有框架调用函数CPOSXPurgeAllDiskBuffers,但没有公开API。我相信底层内核和用户级磁盘缓存代码全部或大部分都在http://www.opensource.apple.com上,所以如果你真的想要,你可以自己实现同样的事情。

正如iMysak所说的,如果你愿意的话,你可以使用exec(或NSTask等)工具。作为一个方面说明,它可以释放使用过的/有线的内存,大概是内存被某些东西使用 - 即使你没有在你自己的数据结构中加入指针,malloc可能也是如此。您是否尝试segfault您的代码?

释放不活动的内存是一个不同的故事。只要将某些内容释放到malloc中,不一定会使malloc将其返回到操作系统。而且你无法强制它。如果您考虑传统UNIX的工作方式,那么它是有道理的:当您要求它分配更多内存时,它会使用sbrk来扩展您的数据段;如果你释放顶部的内存,它可以恢复原状,但如果你释放了中间的内存,那么它就无法做到这一点。当然,现代UNIX系统不能这样工作,但是POSIX和C API都被设计为与那些系统兼容。所以,如果你想确保内存被释放,你必须直接处理内存分配。

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

0

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

+0

使用exec()系统看起来像冻结 – arachide 2012-07-11 10:46:40

+0

我不确定这个评论意味着什么,但也许你没有意识到exec做什么。 (我假设你用C,ObjC或C++编写,但实际上并没有这么说。)“man 3 exec”会告诉你,它会用你正在尝试的那个替换当前的进程跑。所以,除非你真的想退出并“清除”,否则使用它的方式是在子进程中fork(2),然后执行exec(3)。或者,更简单地说,使用posix_spawn(2)包装器。或者,如果您对可可级别更加熟悉,请使用NSTask。 – abarnert 2012-07-11 19:12:25