main
入口函数开始执行代码,在执行代码的过程当中,会建立对象和一些局部变量,其中对象存放在堆中,变量存放在栈上,以上五个区中只有堆是由程序员本身建立和销毁,而其余四个都是系统本身管理。因此从低地址到高地址的的内存区域分别是代码区、常量区、全局区、堆区和栈区。栈区用来存放局部变量,先进后出,一旦出了做用域就会被销毁。程序员不须要管理栈区变量的内存。栈区变量的大小是由上到下分配的,因此先声明的变量地址比后声明的变量地址要大。栈区存储在应用程序容许的内存空间的最上面。程序员
栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就肯定的常数 ) ,若是申请的空间超过栈的剩余空间时,将提示overflow。所以,能从栈得到的空间较小。markdown
存储每个函数在执行的时候都会向操做系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。(函数的调用是在栈中完成的)这块也能够叫作函数帧,从这里也能够引伸出另一个名词叫作栈帧数据结构
栈帧:是指函数(运行中且未完成)占用的一块独立的连续内存区域 函数
通常由程序员分配释放,若程序员不释放,程序结束时可能由OS回收(通常释放后对应的指针应该指向NULL
若是没有指向NULL
就会出现野指针)。注意它与数据结构中的堆是两回事,分配方式相似于链表。堆区的变量地址是由下往上分配的,因此在同一线程中先声明的变量地址要比后声明的变量地址小。spa
堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址的,天然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。因而可知,堆得到的空间比较灵活,也比较大。操作系统
堆在系统中的申请流程:线程
优缺点:指针
代码验证 code
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域,程序结束后有系统释放orm
注意:全局变量和静态变量仍是少用,全局变量和静态变量的生命周期是存在整个程序的,因此大量的使用全局变量和静态变量运行内存会增长
常量区用来存放常量字符串等,程序结束后由系统释放
字符串常量由于可能在程序中被屡次使用,因此在程序运行以前就会提早分配内存且生命周期同程序的生命周期
存放函数的二进制代码