linux C语言 内存申请 堆 栈 大小限制
来源:互联网 发布:淘宝上卖什么 编辑:程序博客网 时间:2024/06/05 16:41
C语言申请内存时堆栈大小限制
一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下:
开辟一片内存空间有2种方式,第一种:int a[];第二种malloc,那么在linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验:
第一种方式:使用malloc申请内存;
这样的方式是在堆区申请的内存,在linux中,其实是在申请的时候基本没有限制,比如32位机器,理论上可以malloc(4G)的大小,因为2^32=4G,但事实上linux的进程地址空间是这样的:
所以经过实验,使用malloc最大能够申请的空间是3G左右,这里要注意,要使用下面这样的方式申请空间:
int MB = 0; while(malloc(1 << 20)) { MB++; } printf("Allocate %d MB total\n", MB);
不能直接
size_t MB = (size_t)(2147483648UL); 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结果
stack size (kbytes, -s) 8192那么代码中
// int MB[2097152]; 4*2097152 = 8192kb int MB[2090000]; MB[0] = 0; MB[2090000 - 1] = 0;
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
- linux C语言 内存申请 堆 栈 大小限制
- C语言申请内存时堆栈大小限制
- C语言中申请堆内存断点及其他常见问题
- C语言申请内存
- 栈内存申请与堆内存申请
- Windows程序内存限制记录(堆大小的限制)
- C语言动态内存申请
- C语言中栈和堆 内存
- jvm 堆内存 栈内存 大小设置 查看堆大小
- 堆和栈的内存申请区别
- 拿来主义:C语言动态申请内存案例
- C语言 动态申请数组内存
- C语言连续申请变量内存问题
- jvm 堆内存 栈内存 大小设置
- jvm 堆内存 栈内存 大小设置
- Linux c 数组大小的限制
- c语言中变量(存储区 栈)和malloc(动态申请 堆)的区别
- C语言中动态内存的堆和栈
- 如何在WPF中使用MVVM开发架构开发一个餐馆点餐系统(CrazyElephant)
- java编程最差实践
- [opencv]haar training 样本训练算法和步骤
- storyboard中tab bar controller更改item的位置问题
- 【oracle】初学jobs
- linux C语言 内存申请 堆 栈 大小限制
- QThread
- 设置Tomcat session有效期
- 程序算法与人生选择
- IOS开动画效果之──实现 pushViewController 默认动画效果
- eclipce开发c/c++小结
- MapReduce执行流程
- 一些学科对机器学习的影响
- java synchronized详解