比如局部变量是保存在栈空间中的,今天突然在想栈的上限是多大呢,什么时候才会栈溢出?

ulimit 命令

linux下使用ulimit 命令可以查看系统的很多上限值。

  • ulimit -a 查看所有

  • ulimit -s 查看栈空间的大小

可以看到系统设置栈的上限是8M

测试

现在我们写个程序测试一下

两种方法:

1、第一种方法:最简单的是在函数或直接在main()函数里定义多个局部变量。

局部变量一定要初始化,不然可能不会给分配内存

2、第二种方法:使用递归申请栈空间更合适,测试方便。

#include<stdio.h>
#include<stdlib.h>

int   i = 1;  //记录申请的次数

void func()
{
    char   a[1048576];  //一次申请 1 M 便于计算

    printf("NO.%d  %ld 字节 %p\n",i,sizeof(a),a);

    i++;
    func();
}

main()
{
    func();
}

共申请了7M ,第8次申请失败,因为栈里面还保存着其他数据,如main函数的参数,所以第8次申请不足1M,说明运行结果和ulimit查看的信息吻合。

3、物理内存有4G,那栈空间可以申请4G么?

设置栈的上限为4G

再次运行程序: 

竟然真的申请了4G,这时候就想到了虚拟内存机制和linux交换空间。显然,这4G真的要物理内存给提供那是不够的,因为除了我们申请的4G ,还有其他进程,内核也需要内存空间,所以肯定使用了交换空间,物理内存不够的时候,把暂时不用的内存数据临时保存到了交换空间。我的交换空间分配了2G 。 
申请成功了,但是明显感觉到了系统卡顿,有时侯在申请了接近3G 的时候会卡一下,此时应该是因为物理内存压力太大,正在往交换空间置换数据吧,然后剩下1G 申请完成。

4、冲动了!这次我们设置栈的上限为 7G > 4G物理内存+2G swap

运行: 

成功了。特别卡,第一次直接系统死机了。

但是有点不解了,物理内存+交换空间 = 6G , 为何能申请7G ? 但是有时候又会中途失败,不能分配7G。

5、寻址空间

需不需要担心申请内存过多,比如像上面递归定义了超多字符串,那地址够用么,变量太多,首地址会不会重复呢?

这个不必担心,64位系统CPU的寻址空间是 2^64 , 0 ~ 0xffffffffffffffff 系统根本用不完这么大的地址空间。况且我们个人电脑的物理内存才是仅仅4G。

所以,64位系统会有很大一部分地址范围用不到,据说这个叫AMD64空洞。

6、申请堆空间

#include<stdio.h>
#include<stdlib.h>

int   i = 1;  //记录申请的次数

void func()
{
    char   a[1048576] = {'1'};  //一次申请 1 M 便于计算
    char   *p = NULL;

    p = (char*)malloc(1048576);

    printf("NO.%d  %ld 字节 %p --><-- %p\n",i,sizeof(a),a,p);

    i++;
    func();
}

main()
{
    func();
}

这里有个问题:经多次测试,如果malloc动态申请的内存特别大时,如上图,依次分配的内存地址是递减的,好像不符合堆向上增长的特点。

7、32位环境测试

上面的代码以gcc -m32 编译运行

这里也有个问题:

堆内存地址开始是减小的:

减到足够小时又开始增大:

有时侯会出现,栈后面用到的地址空间是前面动态申请过的(并未释放)

8、有时候ulimit -s 设置数值过大时会失败,还会导致之后设置任何数值都不会成功。注销重新设置就可以了


总之,还是不要随便更改系统设置的栈大小,不然就会出现上面遇到的几个问题。一般系统默认设置栈段为8M、4M、2M或1M。

[转帖] Linux 下面栈空间大小的实验的更多相关文章

  1. linux查看修改线程默认栈空间大小(ulimit -s)

    linux查看修改线程默认栈空间大小 ulimit -s 1.通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M 2.通过命令 ulimit -s 设置大 ...

  2. 更改Linux默认栈空间的大小

    有时候在Linux写C++程序处理大量的数据,程序内部需要分配很大的数组来存放一些数据,但有时候分配的数组太大的话运行时会出现段错误.这种情况可能是分配的数组大小超过了Linux系统的默认栈空间的大小 ...

  3. 更改Linux栈空间大小

    1.通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M 2.通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400 ...

  4. Linux查看磁盘空间大小命令

    Linux查看磁盘空间大小命令df -hldf -hl 查看磁盘剩余空间df -h 查看每个根路径的分区大小du -sh [目录名] 返回该目录的大小du -sm [文件夹] 返回该文件夹总M数du ...

  5. Linux 查看磁盘空间大小

    (1)查看文件大小 1. 查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   2.查看var目录下文件大小   du -sh var   3.查看指定文件夹下所有文件大小(包括子文件 ...

  6. Linux查看磁盘空间大小

    1. Ubuntu 查看磁盘空间大小命令 df -h Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息, 命令格式: df -hl  显示格式为:  文件系统 容 ...

  7. [Linux] -Docker修改空间大小

    Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小. 池空间大小默认为:100G 容器空间大小默认为是:10G 所以修改空间大小也分为两个: 这里使用centos下的yum进行安 ...

  8. 查看linux目录剩余空间大小

    df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl   显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem S ...

  9. [Linux监控]磁盘空间大小

    echo 192.168.10.69>>ip.list ------------------------------------------- #!/bin/bash #注意if和[]之间 ...

随机推荐

  1. SQL操作语句

    SQL语句与Mysql的语句大体上比较相似.以下是sql server的一套练习题,是很好的数据库操作语句学习资料,学校的学习资料,在此整理了以下. 数据库exam:这是一个模拟电子商务,网上直销的数 ...

  2. svn 更新提交文件冲突

    文件冲突定义:svn up更新服务器文档到本地的时候发现本地的文件有所改动,和svn服务器不同步 服务器会报冲突,让你觉得已谁的为准,根据实际情况我们需要选择是以服务器还是以本地代码为准 报错: Co ...

  3. leetcode-844 Backspace String Compare

    Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...

  4. Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml

    解决方法来源:http://www.cnblogs.com/kaka-bing/archive/2012/10/31/2747490.html 问题描述: 使用Android SDK Manager检 ...

  5. dom阻止事件冒泡

    通常有两种事件流模型,一种是冒泡,一种是捕获.顾名思义,冒泡就是从内往外传播,捕获就是从外往里传播. 对于dom事件,就是这样的.比如,有两个父子div. <div id="pdiv& ...

  6. WC 2019 游记 - 败者之低语

    败者之低语 WC 2019 游记 Day -1 看了一圈PKU和THU的题,感觉图像识别真有意思... 感觉非常讲道理,pku还是比thu简单一点的... 听说高二414在thu没有进面试? 震惊!( ...

  7. 实测—fft IP核使用(包括ifft的配置使用)

    Vivado xilinx fft9.0 使用笔记: ****注 仿真实测1024点的转换需要经过1148个时钟周期才能得到转换结果: 模块配置信号含义请参考pg109文档手册(写的贼烂会看晕),不详 ...

  8. 20155233 刘高乐 Exp9 Web安全基础

    WebGoat 输入java -jar webgoat-container-7.1-exec.jar 在浏览器输入localhost:8080/WebGoat,进入WebGoat开始实验 Cross- ...

  9. POJ 1988&&2236

    并查集,如果只是朴素的路径压缩,那么也就是一句话的事情. 但是,一般都没有这种仁慈的裸题(假的,多了去了) 1988:带权并查集,贼鸡儿像Luogu的那道杨威利的并查集(好像是叫银河英雄传说) 开两个 ...

  10. mfc c++字符串类与 流输出

    一.命名空间 所谓命名空间(namespace),是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的命名空间(namespace)中.而我们要使用的string类也是一 ...