一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下:

开辟一片内存空间有2种方式,第一种:int a[];第二种malloc,那么在linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验:

第一种方式:使用malloc申请内存;

这样的方式是在堆区申请的内存,在linux中,其实是在申请的时候基本没有限制,比如32位机器,理论上可以malloc(4G)的大小,因为2^32=4G,但事实上linux的进程地址空间是这样的:

所以经过实验,使用malloc最大能够申请的空间是3G左右,这里要注意,要使用下面这样的方式申请空间:

  1. int MB = 0;
  2. while(malloc(1 << 20))
  3. {
  4. MB++;
  5. }
  6. printf("Allocate %d MB total\n", MB);

不能直接

  1. size_t MB = (size_t)(2147483648UL);
  2. char *buf = (char*)malloc(MB);

因为可能内存中存在碎片,内存空闲空间总和也许有3G,但是直接申请3G,可能会不成功,因为它不是连续的内存空间。

接下来我又迷茫了,为什么申请堆空间不受到swap空间和物理内存大小的限制呢?由于linux使用的是虚拟内存,因此分配是不受影响的,但是,在使用的时候,我们同时使用的内存大小超过了swap空间和物理内存大小,将会出现一些问题,这里有一篇文章说得不错,记录下:http://www.cfanz.cn/index.php?c=article&a=read&id=103888

第二种方式:使用int a[]申请内存;

这样的方式是在栈区申请的内存,在linux中,会受到ulimit -a中stack size结果的影响

比如我的ulimit -a结果

  1. stack size              (kbytes, -s) 8192

那么代码中

  1. //      int MB[2097152]; 4*2097152 = 8192kb
  2. int MB[2090000];
  3. MB[0] = 0;
  4. MB[2090000 - 1] = 0;
  1. int MB[2097152];

使用int MB[2097152]会失败,因为堆栈可能保存参数,返回地址等等信息,已经占用了部分堆栈,下面的MB[2090000]是可以成功的!

所以总结一下:如果用malloc的方式,一个进程理论上是可以使用3G的内存(应该说可见),但是同时能够使用的真正最大内存只有swap空间+物理空间这么大

使用int a[]这样的形式,申请的空间会受到ulimit -a中stack size的影响。

ps:其实我觉得堆栈就不应该一起说~他俩的概念还是差很多的~我搜到的文章都把这两者混在一起说,非常容易迷惑人.....

记录下参考的文章:

http://www.cfanz.cn/index.php?c=article&a=read&id=103888

http://blog.csdn.net/anghlq/article/details/7087069

http://tech.ddvip.com/2013-05/1369680397196183.html

http://www.jb51.net/LINUXjishu/34605.html

转:C语言申请内存时堆栈大小限制的更多相关文章

  1. R3环申请内存时页面保护与_MMVAD_FLAGS.Protection位的对应关系

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) R3环申请内存时页 ...

  2. 基于链表的C语言堆内存检测

    说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见 ...

  3. C语言中内存分配那些事儿

    C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉, ...

  4. C语言中内存的申请函数

    C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...

  5. c语言之内存的申请malloc() 和释放free()

    c语言之内存的申请malloc() 和释放free() 1.如何使用 malloc 函数 malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存 ...

  6. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

      BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...

  7. VC++中出现stack overflow错误时修改VC++的默认堆栈大小

    VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错 ...

  8. 陈正冲老师讲c语言之内存的申请malloc() 和释放free()

    1.如何使用 malloc 函数 不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程.malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分 ...

  9. C语言动态内存的申请和释放

    什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空 ...

随机推荐

  1. mapreduce框架详解【转载】

    [本文转载自:http://www.cnblogs.com/sharpxiajun/p/3151395.html] 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoo ...

  2. HDU 5514 Frogs (容斥原理)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...

  3. ruby+rt标签的效果

    代码如下: <ruby>我是孤行者<rt>wo shi gu xing zhe</tr></ruby> 效果如下

  4. COM编程入门第二部分——深入COM服务器

    本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...

  5. word2vec浅析

    本文是參考神经网络语言模型.word2vec相关论文和网上博客等资料整理的学习笔记.仅记录 自己的学习历程,欢迎拍砖. word2vec是2013年google提出的一种神经网络的语言模型,通过神经网 ...

  6. cocos2d-3.0 Helloworld::onTouchMoved的处理机制的推測

    bool sign2 = true; bool sign2 = true; void GameLayer::onTouchMoved(Touch *touch, Event *unused){ if( ...

  7. XgCalendar日历插件动态添加参数

    在使用xgcalendar日历插件的时候,参数数组并非只有类型.显示时间.时区等这些参数,还可以根据extParam自定义参数扩展搜索条件,例如根据用户Id搜索不同用户的日历信息,需要将用户的Id存在 ...

  8. Linux之make 、makefile的使用方法

    ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (o ...

  9. C#中MD5加密

    C#中进行MD5加密需要使用MD5这个类,这个类位于System.Security.Cryptography命名空间. 转到元数据得知MD5是抽象类和两个静态方法 上代码详解: //得到其静态方法创建 ...

  10. HBuilder开发app ajax跨域 解决XMLHttpRequest

    <div id="a1" onclick="testXHR()" style="font-size: 5em;">sss1< ...