计算几种的堆栈与堆分别是什么

卡二条的技术圈

共 1589字,需浏览 4分钟

 · 2022-06-15

什么是内存逃逸

  1. 在程序中,每个函数块都会有自己的内存区域用来存自己的局部变量(内存占用少)、返回地址、返回值之类的数据,这一块内存区域有特定的结构和寻址方式,寻址起来十分迅速,开销很少。这一块内存地址称为栈。
  2. 栈是线程级别的,大小在创建的时候已经确定,当变量太大的时候,会"逃逸"到堆上,这种现象称为内存逃逸。
  3. 简单来说,局部变量通过堆分配和回收,就叫内存逃逸。
    本文转自计算机中的堆栈和堆区别

内存逃逸的危害

  1. 堆是一块没有特定结构,也没有固定大小的内存区域,可以根据需要进行调整。
  2. 全局变量,内存占用较大的局部变量,函数调用结束后不能立刻回收的局部变量都会存在堆里面。
  3. 变量在堆上的分配和回收都比在栈上开销大的多。
  4. 对于 go 这种带 GC 的语言来说,会增加 gc 压力,同时也容易造成内存碎片。

如何分析内存逃逸

在使用go build命令时添加编译参数-gcflags=-m。完整命令go build --gcflags=-m ./demo1.go,运行结果中带有下面的heap表示发生了内存逃逸情况。

╰─ go build --gcflags=-m ./demo1.go
# command-line-arguments
./demo1.go:13:6: can inline main
./demo1.go:18:2: moved to heap: y(提示发生了内存逃逸情况)

什么是堆栈

  1. 堆栈是计算机内存的一个特殊区域,用于存储由函数创建的临时变量。在堆栈中,变量在运行时被声明、存储和初始化。
  2. 它是一个临时存储内存。计算任务完成后,变量的内存将自动擦除。堆栈部分主要包含方法、局部变量和引用变量。

什么是堆

  1. 堆是编程语言用来存储全局变量的内存。默认情况下,所有全局变量都存储在堆内存空间中。它支持动态内存分配。
  2. 堆不会自动为您管理,也不会由 CPU 严格管理。它更像是一个自由浮动的内存区域。

堆栈和栈的区别

  1. 堆栈是线性数据结构,而堆是分层数据结构。
  2. 堆栈内存永远不会变得碎片化,而堆内存可能会变得碎片化,因为首先分配内存块,然后释放内存块。
  3. 堆栈仅访问局部变量,而堆允许您全局访问变量。
  4. 堆栈变量不能调整大小,而堆变量可以调整大小。
  5. 堆栈内存在连续块中分配,而堆内存按任意随机顺序分配。
  6. 堆栈不需要取消分配变量,而在堆中则需要取消分配。
  7. 堆栈分配和解除分配由编译器指令完成,而堆分配和解除分配由程序员完成。

使用堆栈的优点

  1. 帮助您以“最后先出(LIFO)”方法管理数据,这在链表和数组中是不可能的。
  2. 当调用函数时,局部变量存储在堆栈中,一旦返回,它就会被自动销毁。
  3. 当变量未在该函数外部使用时,将使用堆栈。
  4. 它允许您控制如何分配和释放内存。
  5. 堆栈会自动清理对象。
  6. 不易损坏,无法调整变量大小。

使用堆内存的优点

  1. 堆可帮助您找到最大和最小数字
  2. 垃圾回收在堆内存上运行,以释放对象使用的内存。
  3. 堆方法也用于优先级队列。
  4. 它允许您全局访问变量。
  5. 堆对内存大小没有任何限制。

使用堆栈的缺点

  1. 堆栈内存非常有限。
  2. 在堆栈上创建太多对象会增加堆栈溢出的风险。
  3. 随机访问是不可能的。
  4. 变量存储将被覆盖,这有时会导致函数或程序的未定义行为。
  5. 堆栈将落在内存区域之外,这可能会导致异常终止。

使用堆的缺点

  1. 它可以提供操作系统可以提供的最大内存
  2. 计算需要更多时间。
  3. 堆内存中的内存管理更为复杂,因为它是全局使用的。
  4. 与堆栈相比,它在执行中花费的时间太多。

何时使用堆或堆栈

  1. 当您需要分配大块内存时,应使用堆。例如,您希望创建一个大尺寸数组或大结构来长时间保留该变量,然后您应该在堆上分配它。
  2. 但是,如果您正在使用相对较小的变量,则只有在使用它们的函数处于活动状态时才需要这些变量。然后,您需要使用堆栈,这样更快,更容易。


浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报