一个go程序产生的内存泄漏问题 memory leak

问题遇到的现象和发生背景

发现一段代码会产生内存泄漏的问题 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)
}
运行结果及报错内容

内存一直没有进行释放

img

GC有在工作go_gc_duration_seconds指标

img

我的解答思路和尝试过的方法

一开始我以为是版本的RSS策略问题结果发现从1.13升级到1.17还有一样的问题

我想要达到的结果

内存会有释放回落

GC回收垃圾和goroutine归还内存给操作系统是两个东西,从1.13开始Scavenger用于解决瞬时占用内存过高的应用向操作系统归还内存的问题。可以调用 debug.FreeOSMemory() 手动归还已经回收的内存。