0x00 前言
本文的版本基于 go version go1.21.3 linux/amd64
0x01 gc 典型触发场景汇总
Golang 的 GC 会自动回收所有不可达对象(无引用链可访问的对象)。经典场景包括局部变量、重新赋值的变量、循环临时变量等。仅在需要优化内存敏感代码时,才考虑手动干预(如手动置 nil
或使用对象池)
1、局部变量(函数内创建的对象),函数内的局部变量在函数返回后失去所有引用,GC 会标记为不可达对象并回收
func createMap() {
m := make(map[string]int) // 局部变量
m["key"] = 1
// 函数结束后,m 超出作用域,不再被引用,会被 GC 回收
}
2、被重新赋值的变量:变量被重新赋值后,原对象失去唯一引用,GC 会回收旧内存
func main() {
data := make([]byte, 100) // 分配 100 字节的切片
data = make([]byte, 200) // 重新赋值后,原 100 字节切片失去引用,会被回收
}
type A struct{
Map map[int]int
}
func main(){
var a A
m1:=make(map[int]int)
m1[1]=1
fmt.Println(m1)
a.Map=m1
m2:=make(map[int]int)
m2[2]=2
a.Map=m2 //m1失去了引用,会被回收
fmt.Println(a.Map)
}
3、循环中的临时变量:每次循环迭代的 temp
都是新对象,迭代结束后失去引用,GC 逐步回收
func process() {
for i := 0; i < 1000; i++ {
temp := make([]int, 1000) // 每次循环创建临时切片
// 循环结束后,temp 超出作用域,会被回收
}
}
4、channel 操作后的对象:通道传递的对象引用计数归零后(如 received
不再使用),GC 回收原数据
func channelExample() {
ch := make(chan *int)
go func() {
x := 42
ch <- &x // 发送 x 的指针到通道
}()
received := <-ch // 接收后,原 goroutine 中的 x 可能仍被引用
// 若 received 后续不再使用,x 会被回收
}
5、结构体或切片中的元素:结构体或切片的内部元素引用被清除后,GC 会回收这些元素
type Data struct {
slice []*int
}
func main() {
d := Data{}
for i := 0; i < 10; i++ {
x := new(int) // 分配内存
d.slice = append(d.slice, x)
}
d.slice = nil // 切片置空后,所有元素失去引用,会被 GC 回收
}
6、闭包中未捕获的外部变量:闭包只延长其捕获变量的生命周期,未捕获的变量(如 b
)会正常回收
func closureExample() {
a := 1
b := 2
go func() {
fmt.Println(a) // 闭包捕获了 a,但未捕获 b
}()
// b 未被闭包引用,函数返回后会被回收
}
0x0 gc 原理
0x0 参考
FEATURED TAGS
Latex
gRPC
负载均衡
OpenSSH
Authentication
Consul
Etcd
Kubernetes
性能优化
Python
分布式锁
WebConsole
后台开发
Golang
OpenSource
Nginx
Vault
网络安全
Perl
分布式理论
Raft
正则表达式
Redis
分布式
限流
go-redis
微服务
反向代理
ReverseProxy
Cache
缓存
连接池
OpenTracing
GOMAXPROCS
GoMicro
微服务框架
日志
zap
Pool
Kratos
Hystrix
熔断
并发
Pipeline
证书
Prometheus
Metrics
PromQL
Breaker
定时器
Timer
Timeout
Kafka
Xorm
MySQL
Fasthttp
bytebufferpool
任务队列
队列
异步队列
GOIM
Pprof
errgroup
consistent-hash
Zinx
网络框架
设计模式
HTTP
Gateway
Queue
Docker
网关
Statefulset
NFS
Machinery
Teleport
Zero Trust
Oxy
存储
Confd
热更新
OAuth
SAML
OpenID
Openssl
AES
微服务网关
IM
KMS
安全
数据结构
hashtable
Sort
Asynq
基数树
Radix
Crontab
热重启
系统编程
sarama
Go-Zero
RDP
VNC
协程池
UDP
hashmap
网络编程
自适应技术
环形队列
Ring Buffer
Circular Buffer
InnoDB
timewheel
GroupCache
Jaeger
GOSSIP
CAP
Bash
websocket
事务
GC
TLS
singleflight
闭包
Helm
network
iptables
MITM
HTTPS
Tap
Tun
路由
wireguard
gvisor
Git
NAT
协议栈
Envoy
FRP
DPI
gopacket
Cgroup
Namespace
DNS
eBPF
GoZero
Gost
Clash
gopsutil
Linux
HIDS
ELKEID
XDP
TC
Systemd
netlink
Kernel