UPD:重构代码,没有改变
这个函数有内存泄漏,但我不知道在哪里。
func CheckProxySOCKS(prox string, c chan QR) (err error) {
//Sending request through proxy
dialer, _ := proxy.SOCKS5("tcp", prox, nil, proxy.Direct)
timeout := time.Duration(5 * time.Second)
httpClient := &http.Client{Timeout: timeout, Transport: &http.Transport{Dial: dialer.Dial}}
res, err := httpClient.Get("https://api.ipify.org?format=json")
if err != nil {
c <- QR{Addr: prox, Res: false}
return
}
_, err = ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
return
}
c <- QR{Addr: prox, Res: true}
return
}我在这里叫它
for _, proxy := range splitedProxies {
go code.CheckProxySOCKS(proxy, respChan)
}
for range splitedProxies {
r := <-respChan
if r.Res {
checkedProxiesArray = append(checkedProxiesArray, r.Addr)
}
}在3-4周期之后,我得到了超过40k的大猩猩(我用runtime.NumGoroutine()来检查)。启动后应用程序在4周期后使用约100 1GB,超过1GB。
所有代码的Github回购
发布于 2018-04-30 12:54:53
您并不总是关闭连接,并且使用新的客户端和传输每个请求。如果丢弃传输,则丢弃空闲池中的任何连接,从而泄漏这些资源。
来自文档
默认情况下,传输缓存连接以供将来重用.这可能在访问许多主机时留下许多打开的连接。可以使用传输的CloseIdleConnections方法以及MaxIdleConnsPerHost和DisableKeepAlives字段来管理此行为。 传输应该被重用,而不是根据需要创建。运输是安全的,以同时使用多个峡谷。
当没有错误时总是关闭响应体,并且总是重用传输。
发布于 2018-04-29 04:58:56
您的问题在于没有关闭响应体,在下面一行中:
_, err := httpClient.Get("https://api.ipify.org?format=json")获取响应变量并关闭主体,如下所示:
r, err := httpClient.Get("https://api.ipify.org?format=json")
if err != nil {
c <- QR{Addr: prox, Res: false}
return
}
defer r.Body.Close()
c <- QR{Addr: prox, Res: true}在docs The client must close the response body when finished with it: 这里
https://stackoverflow.com/questions/50081803
复制相似问题