故障的 malloc 条件
malloc conditions for failure
我正在复习 c,重做一些旧的练习,并在运行此片段时得到一些不寻常的结果(我知道它泄漏,但想知道系统允许多少......
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
void *page = 0; int index;
index = 0;
while(1)
{
page = malloc(1073741824); //1GB
if(!page)break;
++index;
}
printf("memory failed at %dn",index);
return 0;
}
我实际上得到了:
内存在 131070 时出现故障
这表明它认为其分配的 131070 x 1GB 内存(大量泄漏(
我以前了解malloc应该在消耗所有虚拟内存之前失败,当然,如果我尝试在一个块中malloc 20GB,这将失败。
我的设置:乌班图108Gb 内存,<= 2Gb 交换,高清 1TB(这重要吗?
任何人都知道它如何泄漏比我更多的内存
- http://www.win.tue.nl/~aeb/linux/lk/lk-9.html
从 2.1.27 开始,有一个 sysctl VM_OVERCOMMIT_MEMORY 和 proc 文件 /proc/sys/vm/overcommit_memory,值为 1:执行过度提交,0 (默认值(:不要。不幸的是,这不允许你告诉 内核要更加小心,它只允许你告诉内核 不太小心。当overcommit_memory设置为 1 时,每个 malloc(( 将 成功。当设置为 0 时,使用旧的启发式方法,内核仍然 过度承诺。
- http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html
最后一个环节:
- http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html
在某种程度上,Linux分配内存的方式就像航空公司销售飞机一样。 票。航空公司将销售比实际更多的机票 座位,希望一些乘客不会出现。记忆 在 Linux 中以类似的方式管理,但实际上更多 严重程度。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 如果没有malloc,链表实现将失败
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 故障的 malloc 条件