汇总介绍Go开发使用过程中的问题
说明
Golang 问题汇总
内存泄漏问题
golang 内存泄漏一般由于 goroutine 泄漏,cgo 内存泄漏等引起,解决方式:
- 使用 pprof 性能分析工具
- 环境变量
GODEBUG=gctrace=1 输出内存信息
- 环境变量
GOGC 配置
runtime/debug 的 debug.SetGCPercent(100) 函数设置该 GOGC 参数,默认为 100%
GOGC=100 默认,内存翻倍时触发GC
GOGC=200 live heap size 自上次垃圾回收后增长2倍时触发GC
GOGC=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