回答
清除不做你仿佛运行认为它的确如此。它不会“释放不活动/使用/有线存储器”。如手册页说:
它不会影响已通过的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蜜蜂。
您可以直接从OS //使用exec()函数
- 1. 外部空闲内存功能
- 2. iOS - “清洁内存”或“空闲内存”:如何操作
- 3. 为什么此功能在空闲内存时总是崩溃?
- 4. 成功后,哪些cmd.exe内部命令将ERRORLEVEL清除为0?
- 5. 负空闲内存
- 6. 内部JavaScript清除功能
- 7. 我是否需要清除在JavaScript中设置为空闲内存?
- 8. remove_if后的空闲内存
- 9. Java - FloatBuffers的空闲内存
- 10. 字节的空闲内存[]
- 11. 清除apache-karaf缓存的命令
- 12. 查询空闲内存量
- 13. XML :: LibXML perl空闲内存
- 14. strlen和空闲内存
- 15. 没有清除命令的MATLAB可用内存
- 16. 调用命令清除Internet Explorer缓存
- 17. 清除行的命令
- 18. 扩展Symfony 2缓存:清除命令以清除APC
- 19. 功能清空文件内容
- 20. CloudFlare的“清除”功能如何工作?
- 21. 将ImageBrush中的空闲内存设置为WPF中的空格
- 22. 清除角超时内部功能
- 23. 为什么我的按钮功能不能清除()工作?
- 24. gridview删除命令内updatepanel,和单独的__doPostback()功能
- 25. 元素没有清除功能清除
- 26. C中的空闲分配内存
- 27. 表单关闭时的空闲内存
- 28. iphone动画之后的空闲内存
- 29. 函数中的空闲内存
- 30. 循环中的空闲内存
使用exec()系统看起来像冻结 – arachide 2012-07-11 10:46:40
我不确定这个评论意味着什么,但也许你没有意识到exec做什么。 (我假设你用C,ObjC或C++编写,但实际上并没有这么说。)“man 3 exec”会告诉你,它会用你正在尝试的那个替换当前的进程跑。所以,除非你真的想退出并“清除”,否则使用它的方式是在子进程中fork(2),然后执行exec(3)。或者,更简单地说,使用posix_spawn(2)包装器。或者,如果您对可可级别更加熟悉,请使用NSTask。 – abarnert 2012-07-11 19:12:25