Go语言学习笔记:内存管理与块粒度

需积分: 43 124 下载量 179 浏览量 更新于2024-08-10 收藏 1.7MB PDF 举报
"内存管理是计算机系统中的关键部分,特别是在编程语言如Go中。本文将探讨内存块粒度的概念,这是内存分配和管理的基础。内存块粒度涉及到内存分配的最小单位,即page,以及如何通过span和object来组织和管理内存。 1.1 内存块粒度 内存管理通常基于页(page)的概念,页是操作系统分配内存的基本单位。在描述中提到,默认的page大小为4KB。这意味着当程序请求内存时,系统会以4KB的倍数分配内存。然而,单一的page可能不足以满足所有需求,因此引入了span的概念。span是由多个连续的page组成的,它提供了一个更大的内存块,以适应更大的内存需求。 此外,内存块还可以根据存储的对象进行分类,称为object。每个object是为存储特定类型或大小的对象而设计的内存块。为了有效地管理和分配这些内存块,系统会依据大小和对齐方式进行分类,创建不同的规格(class)。这些规格从1到60不等,每个规格对应不同的内存容量,具体容量存储在class_to_size表中。 Go语言的内存管理中,有一个名为NumSizeClasses的常量,表示存在61个不同的大小类。最大小的分配限制(MaxSmallSize)被设定为32KB。这意味着在内存分配过程中,会根据对象大小选择合适大小类,以优化内存的使用和管理效率。 在Go的实现中,InitSizes函数负责计算和初始化大小类。SizeToClass函数接收一个大小值n,如果n在0到MaxSmallSize之间,它会返回对应的大小类,范围在1到NumSizeClasses之间。class_to_size数组记录了每个大小类的最大尺寸,class_to_allocnpages记录了为每个大小类分配新对象时需要的页面数量,而class_to_transfercount则指定了将中央列表中的对象移动到线程自由列表时要移动的数量。 在Go的学习笔记中,作者记录了从2012年开始的Go语言学习过程,包括了接口、方法、指针、包、标准库、反射等内容的学习和更新,以及随着时间的推移,随着Go语言的版本迭代,笔记也不断进行了修正和完善。这表明Go语言的内存管理机制,包括内存块粒度的概念,是在实践中不断优化和完善的。 内存块粒度是内存管理的重要组成部分,它涉及到程序如何高效地请求和使用内存。在Go语言中,通过对page、span和object的精细控制,以及大小类的划分,实现了灵活且高效的内存分配策略。这种策略对于编写高性能、低内存消耗的程序至关重要。"