美文网首页
内存的5大区域

内存的5大区域

作者: 小白PK大牛 | 来源:发表于2020-03-17 11:46 被阅读0次

1.栈区(stack)

栈区:由编译器⾃动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯⼀的。
申请大小:栈是向低地址扩展的数据结构,是⼀块连续的内存的区域。是栈顶的地址和栈的
最⼤容量是系统预先规定好的,栈的⼤⼩是2M(也有的说是1M,总之是⼀个编译时
就确定的常数) ,如果申请的空间超过栈的剩余空间时,将提示溢出,能从栈获得的空间较⼩。
系统响应方法:存储每⼀个函数在执⾏的时候都会向操作系统索要资源,栈区就是函数运⾏时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运⾏分配,随着函数
的结束⽽释放,由系统⾃动完成。
注意:只要栈的剩余空间⼤于所申请空间,系统将为程序提供内存,否则将报异常提
示栈溢出。
优点:快速⾼效,不会产生碎片
缺点:有限制,数据不灵活。(先进后出)

栈空间分静态分配和动态分配两种

2.堆区(heap)

堆区: 由程序员分配和释放,用new/alloc方法创建的对象,手动申请空间,如果程序员不释放,程序结束时,可能会由操作系统回收 。
系统响应方法:

  • ⾸先应该知道操作系统有⼀个记录空闲内存地址的链表。
  • 当系统收到程序的申请时,会遍历该链表,寻找第⼀个空间⼤于所申请空间的堆
    结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
  • 由于找到的堆结点的⼤⼩不⼀定正好等于申请的⼤⼩,系统会⾃动的将多余的那
    部分重新放⼊空闲链表中
    申请大小:堆是向⾼地址扩展的数据结构,是不连续的内存区域。这是由于系统是⽤链表来
    存储的空闲内存地址的,⾃然是不连续的,⽽链表的遍历⽅向是由低地址向⾼地址。堆的⼤⼩受限于计算机系统中有效的虚拟内存。由此可⻅,堆获得的空间⽐较灵活,也⽐较⼤。
    优点:灵活⽅便,数据适应⾯⼴泛

    缺点:效率有⼀定降低,容易产生碎片。

3.全局区(静态区) (static)

全局区(静态区):全局变量和静态变量的存储是放在⼀起的,初始化的全局变量和静
态变量存放在⼀块区域,未初始化的全局变量和静态变量在相邻的另⼀块区域,程序结束后

有系统释放。

4.常量去/数据段

用来存储已经初始化的全局变量,静态变量,常量数据,程序结束后由系统释放

5.代码段

存放函数的⼆进制代码(用来存储程序的代码/指令)

//全局初始化区
int a = 10;
//全局未初始化区
char *p;
main {
    //栈区
    int b;
    //栈
    char s[] = "abc";
    //栈
    char *p1;
    //常量区
    char *p2 = "1234";
    //全局(静态)初始化区
    static int c = 0;
    //分配来的10和20字节的区域在堆区
    m = (char *)malloc(10);
    n = (char *)malloc(20);
}

相关文章

  • 理解Java内存区域与垃圾收集器

    本文主要介绍java内存区域和GC回收 java内存区域 垃圾收集器 参考 java内存区域 运行时内存区域 ja...

  • JVM GC机制总结

    0. JVM内存组成 JVM内存主要由两部分组成:a.线程私有内存区域;b.线程公共内存区域。 线程公用的内存区域...

  • java基础知识

    java 内存区域、JMM、JAVA线程模型、硬件内存模型 java内存区域分为共享区域(堆、方法区常量池)、私有...

  • 内存

    内存的几大区域 栈内存和堆内存 所谓的栈内存和堆内存并不是内存里面有一块区域叫栈,有一块区域叫堆.所谓的栈内存和对...

  • 内存区域

    1.栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯...

  • JAVA内存区域与内存溢出异常

    JAVA内存区域与内存溢出异常 一 Java内存区域 Java虚拟机在执行java程序的...

  • Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 ...

  • JMM与可见性

    JMM jvm运行时数据区域 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域...

  • 第二十六章、JVM内存区域及哪些区域可能发生OutOfMemor

    谈谈 JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError? 通常可以把JVM内存区域分为下...

  • JAVA运行时内存及垃圾回收

    JAVA 1. Java运行时内存区域 在JAVA运行时的内存区域中,由JVM管理的内存区域分为以下几个模块: 程...

网友评论

      本文标题:内存的5大区域

      本文链接:https://www.haomeiwen.com/subject/augzehtx.html