NOTE

3.4 内存管理

1. Golang内存分区 1.1. 栈 Golang栈管理.md 1.2. 堆 Golang堆管理.md 1.3. 全局区-静态全局变量区 - 全局变量+常量 - 分配:进程启动时 - 回收:进程退出时,由操作系统回收 1.4. 代码区 2. Golang runtime.MemStat Top

Go创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. Golang内存分区

1.1. 栈

Golang栈管理.md

1.2. 堆

Golang堆管理.md

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