奇怪的iOS内存分配行为

时间:2011-02-01 21:42:32

标签: iphone memory 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 

让我感到惊讶,因为我认为我的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);
}

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

iPhone肯定有一个虚拟内存系统。缺少的是将内存分页到磁盘的能力。换句话说,它缺少交换空间。