當我試圖在運行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沒有任何虛擬內存系統,它可以解釋與此類似行爲。對此有什麼合理的解釋?