内存分区(栈区 堆区 静态存储区)

81 阅读1分钟

栈(Stack)

概念

由编译器进行管理,自动申请、分配、释放,通常不会太大。
在为变量分配内存的时候会关联到创建它们的词法作用域(例如 Go)。一般来说,这种处理方式比依赖 GC 回收效率要更高,因为编译器可以预先确定在什么时候释放内存并且会生成清理内存的机器指令。
如果编译器无法确定变量的生命周期,就不能使用上述方式分配内存。这种情况称为逃逸到堆上(翻译一下就是分配到堆上)。

分配类型

  • 函数参数(不同平台允许存放的数量不同)
  • 局部变量

堆(Heap)

概念

一般来讲是人为手动进行管理,手动申请、分配、释放。一般所涉及的内存大小并不定,一般会存放较大的对象。另外其分配相对慢,涉及到的指令动作也相对多。
对于在堆上分配的内存,编译器和运行时都很难假设什么时候会被用到以及什么时候可以清理。所以在堆上分配内存又被称为「动态内存分配」。
现在的语言也有自带管理的,例如 Go 能够堆内存的按需分配和自动回收,其中自动回收就是垃圾回收器(GC)

分配类型

  • 指针变量(无法确定变量的生命周期)
    • 纯指针变量
    • 动态类型变量(未确定类型)
    • 函数对外泄漏变量(返回值为指针类型)

静态存储区

由编译器进行管理,用于存储根对象、静态变量、常量