汇总介绍Go开发使用过程中的问题
说明
Golang 问题汇总
内存泄漏问题
golang 内存泄漏一般由于 goroutine
泄漏,cgo 内存泄漏等引起,解决方式:
- 使用 pprof 性能分析工具
- 环境变量
GODEBUG=gctrace=1
输出内存信息 - 环境变量
GOGC
配置runtime/debug
的 debug.SetGCPercent(100)
函数设置该 GOGC 参数,默认为 100%GOGC=100
默认,内存翻倍时触发GCGOGC=200
live heap size 自上次垃圾回收后增长2倍时触发GCGOGC=off
禁用 GC 或 debug.SetGCPercent(-1)
- 使用
runtime/debug
的 debug.FreeOSMemory()
手动释放 - 1.19 版本开始支持
软内存管理
GOMEMLIMIT
变量为运行时设置软内存限制。该内存限制包括 Go 堆和运行时管理的所有其他内存,但不包括外部内存源,如二进制本身的映射、其他语言管理的内存以及操作系统代表 Go 程序持有的内存。GOMEMLIMIT
是一个以字节为单位的数值,带有一个可选的单位后缀。支持的后缀包括 B
、KiB
、MiB
、GiB
和 TiB
。这些后缀表示 IEC 80000-13 标准定义的字节数。也就是说,它们是基于 2 的幂:KiB
表示 2^10
字节,MiB
表示 2^20
字节,以此类推- 使用
runtime/debug
的 debug.SetMemoryLimit
- 或环境变量
GOMEMLIMIT=200MiB
,容器不要是指为申请内存的 100%,最好保留 10% 左右的预留内存- 若配置后还出现 OOM 的情况,可以继续减少
GOMEMLIMIT
的值,保留更多预留空间
go build -gcflags=-m main.go
分析堆、栈类型分配情况
其他
import cycle not allowed