内存五大区

  • 内存五大区图解

    内存五大区.jpg 首先系统会加载二进制代码到内存中,而后加载常量区中的常量,接着加载全局区和静态区(初始化过的静态区和没有初始化过的静态区是分开的),以后程序会找main入口函数开始执行代码,在执行代码的过程当中,会建立对象和一些局部变量,其中对象存放在堆中,变量存放在栈上,以上五个区中只有堆是由程序员本身建立和销毁,而其余四个都是系统本身管理。因此从低地址到高地址的的内存区域分别是代码区、常量区、全局区、堆区和栈区。
  • 内存五大区域详细解释

    • 栈区用来存放局部变量,先进后出,一旦出了做用域就会被销毁。程序员不须要管理栈区变量的内存。栈区变量的大小是由上到下分配的,因此先声明的变量地址比后声明的变量地址要大。栈区存储在应用程序容许的内存空间的最上面。程序员

      栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就肯定的常数 ) ,若是申请的空间超过栈的剩余空间时,将提示overflow。所以,能从栈得到的空间较小。markdown

      存储每个函数在执行的时候都会向操做系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。(函数的调用是在栈中完成的)这块也能够叫作函数帧,从这里也能够引伸出另一个名词叫作栈帧数据结构

      栈帧:是指函数(运行中且未完成)占用的一块独立的连续内存区域 image.png函数

      • 优势:内存是由系统释放和分配的
      • 缺点:内存大小有限制、数据不灵活
    • 通常由程序员分配释放,若程序员不释放,程序结束时可能由OS回收(通常释放后对应的指针应该指向NULL若是没有指向NULL就会出现野指针)。注意它与数据结构中的堆是两回事,分配方式相似于链表。堆区的变量地址是由下往上分配的,因此在同一线程中先声明的变量地址要比后声明的变量地址小。spa

      堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址的,天然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。因而可知,堆得到的空间比较灵活,也比较大。操作系统

      堆在系统中的申请流程:线程

      1. 系统中是存在一个链表的里面记载着空闲地址
      2. 让有申请内存的指令的时候系统会从空闲遍历找到(从小到大遍历)第一个空间大于申请空间的堆结点,而后将该结点从空闲链表中删除而后再分配给申请对象
      3. 因为申请的空间并不是恰好等于分配空间的大小,多疑剩余的空间仍是会返回到空闲链表中

      优缺点:指针

      • 优势:灵活方便,数据适应面普遍
      • 缺点:须要程序员手动释放、申请内存

      代码验证 image.pngcode

    • 全局区

      全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域,程序结束后有系统释放orm

      注意:全局变量和静态变量仍是少用,全局变量和静态变量的生命周期是存在整个程序的,因此大量的使用全局变量和静态变量运行内存会增长

      image.png

    • 常量区

      常量区用来存放常量字符串等,程序结束后由系统释放

      image.png 字符串常量由于可能在程序中被屡次使用,因此在程序运行以前就会提早分配内存且生命周期同程序的生命周期

    • 代码区

      存放函数的二进制代码

  • 总结

    image.png
相关文章
相关标签/搜索