Golang的内存关系

1.Page

Golang的Page,在操作系统对虚拟内存管理的MMU定义的物理页有相似的定义,默认的Page为8KB

2.mSpan

多个连续的Page称之为是一个Span,其定义含义有操作系统的管理的页表相似

3.Size Class

Size Class: 相当于 一个等级和刻度, 比如 第二等级 就代表 一个Page页 8B~16Byte

Object Size: 相当于一个Page的大小,Golang内存管理模块针对内存管理更加细化的内存管理单元

**Span Class:**是否需要 GC扫描(Golang的内存回收机制)

**4.**MCache

那么把上面三个合并在一起就是MCache了, 在每个协程调度器下都有一个MCache

对于Span Class为0和1的,也就是对应**Size Class为0的规格刻度内存,mcache实际上是没有分配任何内存的。**因为Golang内存管理对内存为0的数据申请做了特殊处理,如果申请的数据大小为0将直接返回一个固定内存地址,不会走Golang内存管理的正常逻辑

这就是为什么 使用空结构体能节省内存的原因

Go 复制代码
//第一篇/chapter3/MyGolang/zeroBase.go
package main

import (
"fmt"
)

func main() {
var (
//0内存对象
a struct{}
b [0]int

//100个0内存struct{}
c [100]struct{}

//100个0内存struct{},make申请形式
d = make([]struct{}, 100)
)

fmt.Printf("%p\n", &a)
fmt.Printf("%p\n", &b)
fmt.Printf("%p\n", &c[50])    //取任意元素
fmt.Printf("%p\n", &(d[50]))  //取任意元素
}

5.MCentral与MHeap

注意: MCentral 的访问 和 MHeap的访问 需要加锁

相关推荐
喵同志不止步于码农1 天前
Java Caffeine 快速入门
java·开发语言·后端·并发·缓存一致性
2kπ1 天前
QT开发笔记
开发语言·笔记·qt
青 春 记 忆1 天前
零基础入门Python15|关联、聚合、索引与事务:订单数据库
开发语言·python·后端开发
东风破_1 天前
NestJS CRUD 实战:用 Todos 模块打通 Controller-Service-Module 三层
后端
东风破_1 天前
NestJS 框架入门:从工厂模式到模块化架构
后端
江屿风1 天前
【STM32基础篇】【嵌入式生态问题及历史追溯】流食般投喂
大数据·开发语言·人工智能·笔记·stm32·嵌入式硬件
灯澜忆梦1 天前
【基于GO的Web开发4】html/template 模板语法
后端·golang·html
一只叫煤球的猫1 天前
Spring AI 2.0 源码解析(三):ChatClient 的 Fluent API 如何构建请求?
java·后端·面试
charlie1145141911 天前
深探std::vector:三指针、扩容与迭代器失效
开发语言·c++·开源项目
asyxchenchong8881 天前
R语言混合效应(多水平/层次/嵌套)模型及贝叶斯实现技术应用
开发语言·r语言