发现一段代码会产生内存泄漏的问题 go版本1.17.8
package main
import (
"fmt"
_ "net/http/pprof"
"time"
)
func allocate(s int) {
a := make([]byte, s*1024*1024)
for i := 0; i < len(a); i += 4096 {
a[i] = 'x'
}
fmt.Printf("alloc%c %d\n", a[0], s)
}
func main() {
allocate(100)
allocate(200)
allocate(500)
time.Sleep(300 * time.Second)
}
内存一直没有进行释放
GC有在工作go_gc_duration_seconds
指标
一开始我以为是版本的RSS策略问题结果发现从1.13升级到1.17还有一样的问题
内存会有释放回落
GC回收垃圾和goroutine归还内存给操作系统是两个东西,从1.13开始Scavenger用于解决瞬时占用内存过高的应用向操作系统归还内存的问题。可以调用 debug.FreeOSMemory() 手动归还已经回收的内存。