奇怪的iOS内存分配行为

det*_*zed 5 memory iphone ios4

在我运行iOS 4.2.1的iPhone 3G上尝试分配大量内存时,我注意到了一件很奇怪的事情.

当我malloc(512 * 1024)在一个循环中调用它返回一个有效的指针大约1500次之后,我得到一个NULL

app(2032,0x3e7518b8) malloc: *** mmap(size=524288) failed (error code=12)
*** error: can't allocate region 
Run Code Online (Sandbox Code Playgroud)

它让我感到惊讶,因为我认为我的iPhone没有750 MB的RAM.然后,我添加了一个memset后,malloc并把它带到分配到120的数量,这更有道理.

这是我使用的超简单代码:

for (int i = 1; ; ++i)
{
    void *p = malloc(512 * 1024);
    NSLog(@"%d %p", i, p);
    memset(p, 0, 512 * 1024);
}
Run Code Online (Sandbox Code Playgroud)

我虽然iPhone没有任何可以解释类似行为的虚拟内存系统.对此有什么合理的解释?

Jon*_*pan 5

在iOS(以及许多其他系统)上,调用malloc()实际上并不分配内存.它从OS /内核请求内存,但是在写入内存之前不满足请求(例如,使用memset().)这样可以提高系统内存管理的效率,但是可能会导致误导malloc()性行为.