2011-02-01 2 views
5

Я заметил довольно странную вещь, пытаясь выделить много памяти на моем iPhone 3G под управлением iOS 4.2.1.Странное поведение распределения памяти iOS

Когда я звоню malloc(512 * 1024) в цикле он возвращает действительный указатель на около 1500 раз, после чего я получаю NULL и

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

Это удивило меня, так как я думаю, что мой iPhone не 750 МБ оперативной памяти , Затем я добавил memset после malloc, и это принесло количество распределений до 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() фактически не выделяет память. Он запрашивает память из ОС/ядра, но запрос не выполняется, пока память не будет записана (например, с memset().) Это позволяет повысить эффективность управления памятью системы, но это может привести к ошибочному поведению malloc().

2

У iPhone определенно есть система виртуальной памяти. То, что ему не хватает, - это возможность выгружать память на диск. Другими словами, отсутствует пространство подкачки.

Смежные вопросы