汇总介绍Go开发使用过程中的问题
说明
Golang 问题汇总
内存泄漏问题
golang 内存泄漏一般由于 goroutine 泄漏,cgo 内存泄漏等引起,解决方式:
- 使用 pprof 性能分析工具
- 环境变量
GODEBUG=gctrace=1输出内存信息 - 环境变量
GOGC配置runtime/debug的debug.SetGCPercent(100)函数设置该 GOGC 参数,默认为 100%GOGC=100默认,内存翻倍时触发GCGOGC=200live 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的值,保留更多预留空间
- 若配置后还出现 OOM 的情况,可以继续减少
go build -gcflags=-m main.go分析堆、栈类型分配情况
其他
import cycle not allowed
- 解决方式
- 引入新包
- 引入 intreface