精华内容
下载资源
问答
  • 堆空间和栈空间大小

    千次阅读 2015-04-27 16:49:37
    我们知道,程序运行时在内存中主要有代码段、数据段、堆栈段(堆空间和栈空间)、进程头、动态链接库等区域。 其中数据使用到的: 数据段:静态内存空间,其中数据的总大小和初始值在编译时确定,数据在整个...

    我们知道,程序运行时在内存中主要有代码段、数据段、堆栈段(堆空间和栈空间)、进程头、动态链接库等区域。 其中数据使用到的:

    • 数据段:静态内存空间,其中数据的总大小和初始值在编译时确定,数据在整个程序运行时一直存在。
    • 栈空间:自动内存空间,其中数据的大小在编译时确定,数据的分配和释放也由编译器在函数进入和退出时插入指令完成,数据生命周期和函数一样。
    • 堆空间:动态(手动)内存空间,其中数据的大小和初始值在运行时确定,数据生命周期不定。

    但是有个问题:栈空间和堆空间的大小初始值有多大呢?最大有多大?

    看一个命令ulimit(或limit):

    > ulimit -a
    -t: cpu time (seconds)         unlimited
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     unlimited
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -m: resident set size (kbytes) unlimited
    -u: processes                  91570
    -n: file descriptors           1024
    -l: locked-in-memory size (kb) unlimited
    -v: address space (kb)         unlimited
    -x: file locks                 unlimited
    -i: pending signals            91570
    -q: bytes in POSIX msg queues  819200
    -e: max nice                   30
    -r: max rt priority            99
    -N 15:                         unlimited
    

    这个命令输出一个栈限制:stack size (kbytes) 8192。 这说明Linux默认的用户栈空间的大小是8MB(软限制)。测试一下:

    int main(int argc, char *argv[])
    {
        char a[8192 * 1024];
    }
    

    程序在8185*1024时还能正常,在8186*1024就产生了segmentation fault, 可能包含几KB的栈信息数据。这说明程序的栈空间确实是8MB,并且可以使用ulimit 命令临时改变当前shell下执行程序的栈空间。

    那操作系统能给栈空间的最大值(硬限制)是多少呢?这应该就要看用户空间线性地址的分配, 记得Linux中栈空间的起始地址和堆空间的起始地址是固定的,并向对方方向增长, 那么栈空间和堆空间最大值总和应该就是这两个固定地址直接的内存大小。

    对于堆空间来说,默认是没有软限制的,只依赖硬限制。



    来源:http://www.findfunaax.com/notes/file/141

    展开全文
  • 堆空间大小的设置2.堆空间大小的查看 1.堆空间大小的设置 设置堆空间大小的参数 -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小。 -X 是jvm的运行参数 ms 是memory start -Xmx 用来设置堆空间(年轻代+老...

    1.堆空间大小的设置

    1. 设置堆空间大小的参数
      -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小。
      -Xjvm的运行参数
      msmemory start
      -Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小。

    2. 默认堆空间的大小
      如果不设置堆空间的大小:那么
      初始堆内存大小:物理电脑内存大小 1 / 64。(64分之一)
      最大堆内存大小:物理电脑内存大小 1 / 4。(4分之一)

    3. 手动设置:-Xms600m -Xmx600m
      开发中建议将初始堆内存和最大的堆内存设置成相同的值。设置成相同的值避免了频繁的回收和重新分配堆内存。
      在这里插入图片描述

    2.堆空间大小的查看

    运行下面的Java程序:

    package jvn;
    public class HeapSpace {
        public static void main(String[] args) {
            //返回Java虚拟机中的堆内存总量
            long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
            //返回Java虚拟机试图使用的最大堆内存量
            long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
            System.out.println("-Xms : " + initialMemory + "M");
            System.out.println("-Xmx : " + maxMemory + "M");
    //        System.out.println("系统内存大小为:" + initialMemory * 64.0 / 1024 + "G");
    //        System.out.println("系统内存大小为:" + maxMemory * 4.0 / 1024 + "G");
            try {
                Thread.sleep(1000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    1. 使用命令行的方式:jps / jstat -gc 进程id
      a) 打开命令行,输入jps。查看当前运行的java程序的进程号。可以看到当前运行的java程序的进程号是20204
      在这里插入图片描述
      b) 运行jstat -gc 22024。查看堆空间内存分配情况
      可以看到:堆内存分为了新生代(Survivor区和Eden区),老年代。图中也标注除了元空间,但是它占的空间不属于堆。
      OC:表示的是老年代分配的大小,OU是老年代被使用的大小。同理,其他的xC表示的某某区是分配空间的大小,xU表示的某某区是被使用的空间大小。
      在这里插入图片描述
      1.总共的堆空间的大小为S1C + EC + OC = 2048 + 11264 + 248832 = 262144kb = 256Mb
      2.值得注意的一点是:Survivor区又分为s0区和s1区,这两个区总有一个是空的,也就是不占空间。
      3.自己电脑的内存为16GB = 16384Mb。前面说过默认的初始堆的大小为物理内存大小的1/6416384Mb 除以 64 正好等于 256Mb。也反过来验证了默认的初始堆的大小是物理内存大小的1/64
      4.细心的同学可能注意到,上面在计算堆空间的大小的时候,只计算了新生代和老年代。没有加上元空间的数据。也从侧面证明了起始堆空间只包含新生代和老年代,是不包含元空间的。

    2. 使用JVM参数 -XX:+PrintGCDetails
      选中Java程序鼠标右击,在EclipseRun as -> Run Configurations加入VM参数。如下图所示。
      在这里插入图片描述
      点击run,会得到如下的输出:
      1.PSYoungGen:新生代为76288K
      2.新生代又分为eden65536K,和s0区(from space),s1区(to space)。
      3.ParOldGen:老年代175104K
      4.Metaspace:元空间

    -Xms : 245M
    -Xmx : 3630M
    Heap
     PSYoungGen      total 76288K, used 3932K [0x000000076af00000, 0x0000000770400000, 0x00000007c0000000)
      eden space 65536K, 6% used [0x000000076af00000,0x000000076b2d7240,0x000000076ef00000)
      from space 10752K, 0% used [0x000000076f980000,0x000000076f980000,0x0000000770400000)
      to   space 10752K, 0% used [0x000000076ef00000,0x000000076ef00000,0x000000076f980000)
     ParOldGen       total 175104K, used 0K [0x00000006c0c00000, 0x00000006cb700000, 0x000000076af00000)
      object space 175104K, 0% used [0x00000006c0c00000,0x00000006c0c00000,0x00000006cb700000)
     Metaspace       used 2550K, capacity 4486K, committed 4864K, reserved 1056768K
      class space    used 279K, capacity 386K, committed 512K, reserved 1048576K
    

    更多JVM文章请访问我的JVM专栏:
    https://blog.csdn.net/u011069294/category_10113093.html

    展开全文
  • linux C语言 内存申请 大小限制

    万次阅读 2013-08-19 15:17:38
    C语言申请内存时堆栈大小限制 一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及...第二种malloc,那么在linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验: 第一种方式:使用mall

    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

    展开全文
  • 栈空间和堆空间大小

    千次阅读 2019-08-20 14:37:47
    2、区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的是两回事,分配方式倒是类似于数据结构的链表。 3、全局区(static):也叫...

    一个由C/C++编译的程序占用的内存分为以下几个部分:
          1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
          2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。
         3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。
        4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放。
        5、程序代码区:存放函数体的二进制代码。
        堆和栈的区别:
          一、由以上综述就可以得知,他们程序的内存分配方式不同。
          二、申请和响应不同:
         1、申请方式:stack由系统自动分配,heap需要程序员自己申请,C中用函数malloc分配空间,用free释放,C++用new分配,用delete释放。
         2、申请后系统的响应:
          栈:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出。
          堆:首先应该知道操作系统有一个记录内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请的空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete或free语句就能够正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会将多余的那部分重新放入空闲链表中。
         三、 申请的大小限制不同:
         栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从栈获得的空间较小。
        堆:堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是由链表在存储空闲内存地址,自然堆就是不连续的内存区域,且链表的遍历也是从低地址向高地址遍历的,堆得大小受限于计算机系统的有效虚拟内存空间,由此空间,堆获得的空间比较灵活,也比较大。
         四、申请的效率不同:
         栈:栈由系统自动分配,速度快,但是程序员无法控制。
         堆:堆是有程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。
         五、堆和栈的存储内容不同:
         栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是从右往左入栈的,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令。
         堆:一般是在堆得头部用一个字节存放堆得大小,具体内容由程序员安排。

     

    堆空间和栈空间大小

    我们知道,程序运行时在内存中主要有代码段、数据段、堆栈段(堆空间和栈空间)、进程头、动态链接库等区域。 其中数据使用到的:

    • 数据段:静态内存空间,其中数据的总大小和初始值在编译时确定,数据在整个程序运行时一直存在。
    • 栈空间:自动内存空间,其中数据的大小在编译时确定,数据的分配和释放也由编译器在函数进入和退出时插入指令完成,数据生命周期和函数一样。
    • 堆空间:动态(手动)内存空间,其中数据的大小和初始值在运行时确定,数据生命周期不定。

    但是有个问题:栈空间和堆空间的大小初始值有多大呢?最大有多大?

    看一个命令ulimit(或limit):

    > ulimit -a
    -t: cpu time (seconds)         unlimited
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     unlimited
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -m: resident set size (kbytes) unlimited
    -u: processes                  91570
    -n: file descriptors           1024
    -l: locked-in-memory size (kb) unlimited
    -v: address space (kb)         unlimited
    -x: file locks                 unlimited
    -i: pending signals            91570
    -q: bytes in POSIX msg queues  819200
    -e: max nice                   30
    -r: max rt priority            99
    -N 15:                         unlimited
    

    这个命令输出一个栈限制:stack size (kbytes) 8192。 这说明Linux默认的用户栈空间的大小是8MB(软限制)。测试一下:

    int main(int argc, char *argv[])
    {
        char a[8192 * 1024];
    }
    

    程序在8185*1024时还能正常,在8186*1024就产生了segmentation fault, 可能包含几KB的栈信息数据。这说明程序的栈空间确实是8MB,并且可以使用ulimit 命令临时改变当前shell下执行程序的栈空间。

    那操作系统能给栈空间的最大值(硬限制)是多少呢?这应该就要看用户空间线性地址的分配, 记得Linux中栈空间的起始地址和堆空间的起始地址是固定的,并向对方方向增长, 那么栈空间和堆空间最大值总和应该就是这两个固定地址直接的内存大小。

    对于堆空间来说,默认是没有软限制的,只依赖硬限制。

    展开全文
  • 和栈空间大小和作用

    千次阅读 2018-10-19 00:27:21
    我见过有文章认为x86/x64体系架构的系统默认栈空间大小是1M,而安腾系列默认4M,对此我个人表示不能赞同。栈和都是在可用内存空间之中分配的,而硬件上的内存应该是完全一样的,也就是说栈可以分配到硬件内...
  • Linux 程序栈空间大小

    千次阅读 2019-10-15 13:09:56
    Linux系统中程序的内存空间一般被划分成两个区域: 栈空间和堆空间(其他空间区域本文不做讨论):  在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被...
  • 更改Linux默认栈空间大小

    千次阅读 2014-05-30 18:21:31
    1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M 2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M 3、可以在/etc/rc.local 内 加入 ulimit -...
  • 堆空间和栈空间的大小

    千次阅读 2015-09-04 16:38:17
    我们知道,程序运行时在内存中主要有代码段、数据段、堆栈段(堆空间和栈空间)、进程头、动态链接库等区域。 其中数据使用到的: 数据段:静态内存空间,其中数据的总大小和初始值在编译时确定,数据在整个...
  • Linux 溢出 分析

    千次阅读 2017-03-21 16:52:17
    1. Linux堆管理算法  Linux系统通过glibc程序库提供堆内存管理功 能,存在两种堆管理算法.  glibc2.2.4及以下版本是使用Doug Lea的实现方法 tcmalloc .  glibc2.2.5及以上版本采用了Wolfram Gloger的 ...
  • Linux进程空间分配

    2020-12-09 15:23:03
    1. Linux中进程空间的分配情况如下: 从上图可以看出,进程的空间分配:与进程相关的数据结构(页表、内核栈、task) ---> 物理内存 ---> 内核代码和数据 ---> 用户栈 ---> 共享库的内存映射区 ---&...
  • 栈和空间大小 C++

    2019-09-03 22:06:56
    栈顶的地址和栈的最大容量是系统预先规定好的,在Window下,栈的大小是2MB,Linux下,默认栈空间大小为8MB,可通过ulimit -s来设置。 特点:栈的速度快、空间小,不灵活 是向高地址扩展的数据结构,是不联系...
  • Linux】如何查看内存空间大小

    千次阅读 2019-12-04 11:26:44
    我发现现在网络的信息确实很,然后很问题打开后就是一大堆讲解,有时候其实不利于我们找到自己 想要的内容。 查看内存大小就背会两个操作: df -hl du -sh * 可以再多一个 free 没了,别看了很命令眼花...
  • Linux用户空间与内核空间

    千次阅读 2016-04-25 10:07:27
     Linux 简化了分段机制,使得虚拟地址(逻辑地址)与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G(2^32)。  Linux内核将这4G字节的空间分为两部分。将最高的 1G字节(从虚拟地址0xC0000000到0...
  • linux内核空间和用户空间认识和区别

    千次阅读 2017-03-04 20:44:16
    linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是... Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的
  • Linux堆内存管理深入分析

    千次阅读 2016-05-23 22:04:20
    Linux堆内存管理深入分析 https://jaq.alibaba.com/community/art/show?articleid=315 http://www.cnblogs.com/alisecurity/p/5520847.html 0 前言 近年来,漏洞挖掘越来越火,各种...
  • 目录内核空间和用户空间为什么需要区分内核空间与用户空间内核态与用户态如何从用户空间进入内核空间整体结构总结另一种说法一、4G地址空间解析二、虚拟地址空间分配及其与物理内存对应图三、物理内存分配图 ...
  • Linux虚拟地址空间

    千次阅读 2018-11-02 21:18:47
    Linux虚拟地址空间 注:本文来自篇博客整理,具体博客链接在博客下方 在任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的...
  • linux查看修改线程默认栈空间大小 ulimit -s ( ulimit:控制shell程序的资源) a、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M b、通过命令 ulimit -s 设置大小值 临时改变栈空间...
  • 先占到
  • Linux 进程空间

    千次阅读 2018-04-12 15:53:13
    对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行初未对...
  • Linux进程的

    千次阅读 2015-03-07 19:22:35
    可以理解成是进程的一块内存区域(已经分配实际物理内存,但并不是所有的地址空间都分配了物理内存,其大小根据系统类型和版本来定) 用来供进程中的程序动态分配内存空间 通常,进程通过向操作系统批发一块...
  • linux 溢出学习之malloc管理机制原理详解

    万次阅读 多人点赞 2017-03-02 18:47:57
    前言在pwn的学习过程中,最为难啃的骨头莫过于相关的利用,然而无论是在实际情况下还是在ctf比赛中,利用都是绝对的主流,是漏洞的主要类型之一。鉴于国内相关资料有限,系统讲解溢出利用的更是少之又少,我在...
  • linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。  Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的...
  • Linux 地址空间分布

    千次阅读 2013-10-28 10:42:41
    地址空间分布  最近看了本书,突然对于地址空间有些疑惑。在深入理解linux内核中把地址分为三类:逻辑地址(汇编语言中操作数地址或指令的地址,对于80x86的cup,逻辑地址是段+段内偏移地址)、线性地址(也叫...
  • linux内核空间与用户空间信息交互方法 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,992
精华内容 41,196
关键字:

linux堆空间大小

linux 订阅