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的访问 需要加锁

相关推荐
乐悠小码6 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.8 分钟前
Pod控制器
java·开发语言
程序猿麦小七16 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
敲敲敲-敲代码17 分钟前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
蓝田~24 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
theLuckyLong25 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
ROC_bird..25 分钟前
STL - vector的使用和模拟实现
开发语言·c++
.生产的驴26 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
小扳30 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
MavenTalk31 分钟前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move