Http 释放未使用的内存?

Http 释放未使用的内存?,http,go,memory,server,garbage-collection,Http,Go,Memory,Server,Garbage Collection,我使用以下功能下载小于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() b

我使用以下功能下载小于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
}
这很好,但是系统上的所有内存都被消耗掉了


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

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

您可以触发gc释放未使用的对象,也可以敦促您的Go运行时释放内存回操作系统,但所有这些都只是救火。一个写得很好的Go应用程序不应该调用这些

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

你如何做到这一点?一些方法(您甚至可以组合这些解决方案):

  • 限制服务需要大内存的请求,更多信息:;也

  • 使用内存/缓冲池,不要一直分配大数组/片,更多信息:

  • 创建/更改处理单元,使其不在字节片上操作,而是在字节片上操作,这样就不需要将所有内容读入内存,只需将
    resp.Body
    打开即可。请注意,即使多个装置必须读取/检查阀体,也可以只读取和处理一次,而不将其保存在内存中。方法可以是,也可以是自定义解决方案