当我运行以下代码时,它会慢慢地占用我的内存,甚至开始使用交换空间:
如果我不用for循环运行它,就不会使用任何内存:
我只能得出NSMutableData仅仅是“保留”内存,当访问它时才真正“分配”内存的结论。这是如何实现的?
这是通过硬件(CPU)完成的吗?
NSMutableData有没有办法在其“保留”的内存中捕捉内存写入,然后才做“分配”?
这是否意味着调用[NSMutableData dataWithLength:length]永远不会失败?如果需要,它是否可以使用交换来分配任何大小的内存?
如果它可能失败,我的db变量将为空吗?
在苹果公司的“NSMutableData Class Reference”中,我只看到了关于这些主题的模糊句子。
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;
}
如果我不用for循环运行它,就不会使用任何内存:
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 Class Reference”中,我只看到了关于这些主题的模糊句子。
overcommit_memory
和overcommit_ratio
来更改Linux的过度承诺行为。特别地,将overcommit_memory
设置为2意味着它只会提交交换空间+物理内存的overcommit_ratio%。 - Matthew Flaschenmmap()
(malloc在表面下执行)带有一个标志MAP_NORESERVE
,它允许过度承诺行为。然而,如果像malloc()一样不指定此标志,则仍会过度承诺。 - mvds