Golang的内存管理是怎么样的?(arena区,bitmap区,spans区)

野性酷女 2024-02-19 10:16 11阅读 0赞

概述

golang的内存管理是把对象放在一个个的span中,不同大小的对象放在不同的span中,有64种。Go语言内存划分的三个区域分别为:arena区,bitmap区,spans区。对象分配在arena区,基本存储单元为span。bitmap区记录了GC和对象是否包含指针的标志位,spans记录了span索引指针,便于查找。

详述

在 Go 语言的垃圾回收器中,有三个重要的内存区域:Arena 区、Bitmap 区和 Spans 区,它们在内存管理和垃圾回收过程中扮演着关键的角色。

  1. Arena 区:Arena(或称为堆区)是用于分配和管理大对象的内存区域。大对象是那些无法在栈上分配的较大的对象,通常是大型结构体或通过 newmake 分配的引用类型。Arena 区域的内存由垃圾回收器负责分配和回收,它使用了分代垃圾回收算法。
  2. Bitmap 区:Bitmap(位图)是用于跟踪 Arena 区域的内存分配和使用情况的数据结构。每个 Arena 区域都有一个对应的 Bitmap,用于记录该区域内每个字节的分配状态(已分配或未分配)。Bitmap 区域的大小与 Arena 区域的大小相同,但以位为单位进行表示,因此它更加节省内存。
  3. Spans 区:Spans(跨度)是用于管理和跟踪小对象分配的内存区域。小对象是那些可以在栈上分配的较小的对象,如小型结构体或基本类型。Spans 区域维护了一组固定大小的内存块,每个内存块称为一个 Span。Spans 区域使用位图来跟踪每个 Span 的分配状态,以及每个对象的大小。

这三个内存区域相互协作,实现了 Go 语言的内存管理和垃圾回收机制。Arena 区用于分配和管理大对象,Bitmap 区用于跟踪 Arena 区的内存分配情况,而 Spans 区用于管理和跟踪小对象的分配。这种结构和算法的组合,使得 Go 语言具有高效、安全的内存管理能力,能够自动处理内存的分配和回收。

发表评论

表情:
评论列表 (有 0 条评论,11人围观)

还没有评论,来说两句吧...

相关阅读