Golang的内存管理是怎么样的?(arena区,bitmap区,spans区)
  0SnbOly3LC5t 2023年11月19日 19 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 语言具有高效、安全的内存管理能力,能够自动处理内存的分配和回收。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  raKFu9QULpEG   2023年12月23日   52   0   0 gogo
0SnbOly3LC5t