當我運行下面的代碼,它慢慢地吃了我的記憶,甚至開始使用交換:NSMutableData如何分配內存?
long long length = 1024ull * 1024ull * 1024ull * 2ull; // 2 GB
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
}
如果我沒有對循環中沒有內存使用在所有運行:
long long length = 1024ull * 1024ull * 1024ull * 2ull;
db = [NSMutableData dataWithLength:length];
char *array = [db mutableBytes];
/* for(long long i = 0; i < length - 1; i++) {
array[i] = i % 256;
} */
我只能得出結論,NSMutableData只是「保留」內存,當它被訪問時,它真的「分配」它。它是如何完成的?
這是通過硬件(CPU)完成的嗎?
有沒有辦法讓NSMutableData在其「保留」內存中捕獲內存寫入,然後才執行「分配」?
這是否也意味着致電[NSMutableData dataWithLength:length]
永遠不會失敗?它可以使用交換分配任何大小的內存來獲得它,如果需要?
如果它可以失敗將我的db變量爲空?
在蘋果的「NSMutableData類參考」中,我只看到了關於這些主題的模糊句子。
可以通過設置'overcommit_memory'和'overcommit_ratio'來改變Linux overcommit行爲。特別是,將'overcommit_memory'設置爲2意味着它只會提交物理內存的交換空間+ overcommit_ratio%。 – 2010-08-02 12:13:00
另見[overcommit-accounting documentation](http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting)。 – 2010-08-02 12:20:17
關於linux的一個有趣的事情是'mmap()'(malloc在表面下面執行)需要一個標誌'MAP_NORESERVE',它允許超負荷的行爲。但是,如果您 - 像malloc() - 不指定此標誌,它仍然過量使用。 – mvds 2010-08-02 12:35:14