Http 释放未使用的内存?
我使用以下功能下载小于20MB的文件。它将整个内容读取到内存中,因为在将其写入磁盘之前,另一个函数必须对字节执行操作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
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
打开即可。请注意,即使多个装置必须读取/检查阀体,也可以只读取和处理一次,而不将其保存在内存中。方法可以是,也可以是自定义解决方案