2011-02-01 65 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絕對擁有虛擬內存系統。它缺少的是將內存分頁到磁盤的功能。換句話說,它缺少交換空間。