内存四区模型

内存地址编号是从0开始的,默认采用无符号16进制整型数据表示

1. 代码区(text)

存放CPU执行的机器指令,通常代码区是可共享的。对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,以防程序意外地修改它的指令。

2. 数据区(data)

数据区又分为三部分,全局变量区域、初始化数据区,和未初始化数据区(bss)。该区包含了在程序中明确被初始化的全局变量,已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据。
● 未初始化区域的数据在程序开始执行之前被内核初始化为0或者空(Nil)。多个空结构体指向同一块内存地址,但不会占用内存空间。使用空struct对内存更友好,这样,go对动态分配内存,并且是一个固定的地址,避免了内存滥用。
● 程序在加载到内存中之前,代码区和数据区的大小是固定的,且程序运行期间不能改变。程序运行时,把程序加载到内存,除text和data之外,新增了栈和堆。

3. 堆区(heap)

堆是一个大容量,它的容量要远远大于栈,用于动态内存分配。
如果操作内存小于32KB,go内存管理工具为其创建内存空间;
如果大于32KB,使用mheap为其在堆区开辟内存空间;
根据语言的不同,对内存的管理机制不一样;对于C,C++,一般都由程序员分配和释放,若是程序员不释放,程序结束时由操作系统回收。而GO、Java、python等由垃圾回收机制(GC),用来自动释放内存。

4. 栈区(stack)

栈是一种先进后出,后进先出的内存结构,优先使用高地址,与其它不一致,它由高地址指向低地址由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。
在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放这段栈空间。

你可能感兴趣的:(吾解,其他)