NOTE
3.4 内存管理
1. Golang内存分区 1.1. 栈 Golang栈管理.md 1.2. 堆 Golang堆管理.md 1.3. 全局区-静态全局变量区 - 全局变量+常量 - 分配:进程启动时 - 回收:进程退出时,由操作系统回收 1.4. 代码区 2. Golang runtime.MemStat Top
这是历史学习笔记,可能存在过时或不完整的理解。
1. Golang内存分区
1.1. 栈
1.2. 堆
1.3. 全局区-静态全局变量区
- 全局变量+常量
- 分配:进程启动时
- 回收:进程退出时,由操作系统回收
1.4. 代码区
2. Golang runtime.MemStat
Top RSS看到是Golang程序占用的物理内存
Golang程序占用的字节数由Go Runtime+非Go Runtime(cgo)管理
Go Runtime管理的内存分为堆和栈,可以通过runtime.MemStats看出
其中Sys类似于Top的RSS,
Go Runtime会把Sys分成两部分,堆和栈,即Sys=HeapSys+StackSys
2026 注:这里的对应关系不准确。
MemStats.Sys不能直接当作 RSS,Sys也不只包含HeapSys + StackSys;RSS 还可能包含 cgo、mmap 等 Go runtime 之外的内存。
堆也会分成两部分,已使用和未使用,即HeapSys=HeapInuse+HeapIdle
未使用的堆除去已归还给OS的,剩下是自己保留的,即HeapIdle-HeapReleased
Go语言:runtime.ReadMemStats(m *MemStats)读取到的内存相关指标的含义和区别_pengpengzhou的博客-CSDN博客
泽民博客 | Jekyll theme
# runtime.MemStats
常规统计信息
# Alloc = 2 937 593 488 同HeapAlloc
# TotalAlloc = 21510 240 014 544 分配给堆对象的字节。累计值只会增加不会减少
# Sys = 4 239 444 952 从OS获取的内存字节。包括heap、stack、内部结构,【相似于Top的RSS】
# Lookups = 0
# Mallocs = 212712953221 分配的堆对象的总数。累计值只会增加不会减少
# Frees = 212 702 641 433 释放的堆对象的总数。累计值只会增加不会减少
分配堆内存统计
# HeapAlloc = 2 937 593 488 分配给堆对象的字节。包括可达和不可达的对象
# HeapSys = 4 012 802 048 从OS获取的堆内存字节。【HeapSys=HeapInuse+HeapIdle】
# HeapIdle = 973 094 912 未使用的span字节。【HeapIdle-HeapReleased是可以归还给OS的内存字节但是runtime保留了,避免重新申请】
# HeapInuse = 3 039 707 136 已使用的span字节
# HeapReleased = 27 262 976 归还给OS的内存字节
# HeapObjects = 10311788 分配的堆对象的数目。
栈内存统计
# Stack = 13729792 / 13 729 792
# MSpan = 15704192 / 26263552
# MCache = 13888 / 163840
# BuckHashSys = 26252154
# GCSys = 152306400
# OtherSys = 7927166
# NextGC = 3897770816
# LastGC = 1649405542366123388
# PauseNs = [xxx]
# PauseEnd = [yyy]
# NumGC = 17446
# NumForcedGC = 0
# GCCPUFraction = 0.[已脱敏证件号]
# DebugGC = false