Go FaQ

发布时间: 更新时间: 总字数:469 阅读时间:1m 作者: IP上海 分享 网址

汇总介绍Go开发使用过程中的问题

说明

Golang 问题汇总

内存泄漏问题

golang 内存泄漏一般由于 goroutine 泄漏,cgo 内存泄漏等引起,解决方式:

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

其他

import cycle not allowed

  • 解决方式
    • 引入新包
    • 引入 intreface
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数