小编典典

释放未使用的内存?

go

我正在使用以下功能下载小于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其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数?


阅读 247

收藏
2020-07-02

共1个答案

小编典典

您可能会触发gc使用释放未使用的对象,runtime.GC()并且可能敦促Go运行时使用释放内存到OS
debug.FreeOSMemory(),但是所有这些都只是在扑救。编写良好的Go应用程序永远不必调用它们。

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

  • 创建/更改处理单元不是在字节片上而是在io.Readers 上进行操作,因此您无需将所有内容读入内存,就可以继续进行resp.Body下去。请注意,即使必须读取/检查多个主体,也仍然可以只读取和处理一次,而不将其保存在内存中。装置可以是io.Pipe()io.TeeReader()或定制的解决方案。
2020-07-02