Dr.*_*eon 3 c memory macos cocoa objective-c
所以,这就是我要做的事情:
purge命令的方式执行,但是以编程方式执行.我已经尝试过这里的代码(它的作者声称它有效),但它只是让Mac OS X冻结:
void
free_up_memory()
{
int c;
char *p, *q;
for(c = 0; c < 2048; c++)
{
if(!(p = malloc(1024 * 1024)))
{
return;
}
for(q = p; q < p + (1024 * 1024); q += 4096)
{
*q = 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
bbu*_*bum 23
现实情况是,代码没有做 - 而且永远不会做 - 它声称的东西.这是垃圾.
它所要做的就是破坏系统的缓冲区缓存子系统,并可能使机器快速进入分页,导致看起来完全像锁定的症状.特别是在具有慢速(例如5,400rpm笔记本电脑驱动器)硬盘的系统上.
至少,在具有相对少量RAM的系统上.在具有大量RAM和相对较轻的应用程序运行的系统上,该程序将驱逐2GB的缓冲区缓存,导致各种I/O操作变慢,因为需要从磁盘重新读取各种内容,而不是真的帮忙.
也不应该有任何这样的事情; 如果一个应用程序需要内存,系统将根据需要从缓冲区缓存中驱逐页面和/或将内存分页到磁盘(在OS X上 - 在iOS上没有能够编写脏页面以便保持响应性的寻呼机).
调用purge将驱逐各种磁盘缓冲区缓存并在冷启动时模拟条件,但是 - 再次 - 这只会破坏系统的缓存机制,而不会实际提高用户级应用程序的性能.作为手册页文档,它对于在冷缓存状态下测试应用程序性能非常有用,但即使这样也有点可疑,因为它purge不会驱逐可被驱逐的所有内容; 不会干净地模拟冷态.
对于史蒂夫·杰西普(Steve Jessep)非常有效的观点,可能存在这样的情况:对purge(或类似)的调用可能会提高性能.这通常 - 几乎普遍 - 在一般情况下崩溃,因为用户进程A无法知道用户进程B,C,D,....,Z可能在附近的任何点处进行或者遥远的未来.例; 一个可能去清除东西只是为了让RSS Feed Scraper R翻译掉几MB的XML进行解析和持久化,立即使清除无效.更糟糕的是,R的最后一次刷新可能还有潜伏在高速缓存中的位,这样R的刷新对I/O造成的损失使得它更慢且更昂贵(包括耗费电池寿命).
这段代码实际上做的是分配尽可能多的内存,在1MB块中最多可以分配2GB,并向其写入一些数据以确保内存实际提交.也就是说,确保您不仅仅分配了虚拟地址空间而且没有内存.然后它泄漏了它.
因此,代码所做的是"强制操作系统执行内存不足时的操作".然后当这个程序退出时,它的内存被释放,你有很多很好的自由空间.
这段代码的作者希望"当内存不足时操作系统会做什么"是释放你所谓的"非活动内存".看起来它实际上为你做的就是冻结.显然这是一个错误.任何时候都有任意数量的设备和服务在运行,其中只有一个需要有缺陷而导致问题.对于操作系统冻结,问题必须是高于用户模式的运行,所以我很失望,但并不是真的很惊讶.