Golang的内存管理是怎么样的?(arena区,bitmap区,spans区)
概述
golang的内存管理是把对象放在一个个的span中,不同大小的对象放在不同的span中,有64种。Go语言内存划分的三个区域分别为:arena区,bitmap区,spans区。对象分配在arena区,基本存储单元为span。bitmap区记录了GC和对象是否包含指针的标志位,spans记录了span索引指针,便于查找。
详述
在 Go 语言的垃圾回收器中,有三个重要的内存区域:Arena 区、Bitmap 区和 Spans 区,它们在内存管理和垃圾回收过程中扮演着关键的角色。
- Arena 区:Arena(或称为堆区)是用于分配和管理大对象的内存区域。大对象是那些无法在栈上分配的较大的对象,通常是大型结构体或通过
new
或make
分配的引用类型。Arena 区域的内存由垃圾回收器负责分配和回收,它使用了分代垃圾回收算法。 - Bitmap 区:Bitmap(位图)是用于跟踪 Arena 区域的内存分配和使用情况的数据结构。每个 Arena 区域都有一个对应的 Bitmap,用于记录该区域内每个字节的分配状态(已分配或未分配)。Bitmap 区域的大小与 Arena 区域的大小相同,但以位为单位进行表示,因此它更加节省内存。
- Spans 区:Spans(跨度)是用于管理和跟踪小对象分配的内存区域。小对象是那些可以在栈上分配的较小的对象,如小型结构体或基本类型。Spans 区域维护了一组固定大小的内存块,每个内存块称为一个 Span。Spans 区域使用位图来跟踪每个 Span 的分配状态,以及每个对象的大小。
这三个内存区域相互协作,实现了 Go 语言的内存管理和垃圾回收机制。Arena 区用于分配和管理大对象,Bitmap 区用于跟踪 Arena 区的内存分配情况,而 Spans 区用于管理和跟踪小对象的分配。这种结构和算法的组合,使得 Go 语言具有高效、安全的内存管理能力,能够自动处理内存的分配和回收。
还没有评论,来说两句吧...