【问题标题】:Freeing unused memory?释放未使用的内存?
【发布时间】:2026-02-16 07:35:01
【问题描述】:

我正在使用以下功能下载小于 20MB 的文件。它将整个内容读取到内存中,因为另一个函数必须先对字节执行工作,然后才能将其写入磁盘。

func getURL(url string) ([]byte, error) {
    resp, err := http.Get(url)
        if err != nil {
            return nil, fmt.Errorf("getURL: %s", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
            return nil, fmt.Errorf("getURL: %s", err)
    }

    return body, nil
}

这工作正常,但系统上的所有内存都被消耗了。

body使用的内存被另一个函数处理后是否可以释放,这样内存使用不会大于当前正在处理的字节数?

【问题讨论】:

    标签: http go memory server garbage-collection


    【解决方案1】:

    首先我建议阅读以下问题/答案:

    FreeOSMemory() in production

    Golang - Cannot free memory once occupied by bytes.Buffer

    您可以使用 runtime.GC() 触发 gc 以释放未使用的对象,并且您可以使用 debug.FreeOSMemory() 敦促您的 Go 运行时将内存释放回操作系统,但所有这些都只是灭火。编写良好的 Go 应用程序永远不必调用这些。

    您应该做的是防止运行时分配大量内存。

    您如何实现这一目标?一些方法(您甚至可以组合这些解决方案):

    【讨论】: