[英]Why does allocating large chunks of memory fail when reallocing small chunks doesn't
此代码导致x
指向大小为100GB的内存块。
#include <stdlib.h>
#include <stdio.h>
int main() {
auto x = malloc(1);
for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);
while (true); // Give us time to check top
}
虽然这段代码失败了。
#include <stdlib.h>
#include <stdio.h>
int main() {
auto x = malloc(1024ULL*1024*100*1024);
printf("%llu\n", x);
while (true); // Give us time to check top
}
那么你在成功的内存中分配更少的内存:
for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);
最后一个realloc
是:
x = realloc(x, 1023 * (1024ULL*1024*100));
相比于:
auto x = malloc(1024 * (1024ULL*100*1024));
也许这就是你的记忆界限 - 最后的100M打破了骆驼的背部?
我的猜测是,系统的内存大小小于您尝试分配的100 GiB。 虽然Linux确实过度使用内存,但它仍然无法满足超出其要求的要求。 这就是第二个例子失败的原因。
另一方面,第一个例子的许多小增量低于该阈值。 因此,当内核知道您不需要任何先前的内存时,它们中的每一个都会成功,因此它没有迹象表明它将无法支持那100个额外的MiB。
我相信来自进程的内存请求失败的阈值是相对于可用的RAM,并且可以调整(虽然我不记得究竟如何)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.