2011-02-01 66 views
5

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

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

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

这让我很吃惊,因为我觉得我的iPhone没有750 MB的RAM 。然后我在malloc之后添加了一个memset,它将分配数降至120,这更有意义。

这里是超级简单的代码,我用:

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

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

回答

5

在iOS(和许多其他系统)上,调用malloc()实际上并不分配内存。它向OS /内核请求存储器,但是直到写入存储器才满足请求(例如使用memset()。)这可以提高系统内存管理的效率,但会导致误导malloc()行为。

2

iPhone绝对拥有虚拟内存系统。它缺少的是将内存分页到磁盘的功能。换句话说,它缺少交换空间。