首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Goroutines内存泄漏

Goroutines内存泄漏
EN

Stack Overflow用户
提问于 2018-04-28 22:57:58
回答 2查看 1.9K关注 0票数 0

UPD:重构代码,没有改变

这个函数有内存泄漏,但我不知道在哪里。

代码语言:javascript
复制
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
}

我在这里叫它

代码语言:javascript
复制
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回购

EN

回答 2

Stack Overflow用户

发布于 2018-04-30 12:54:53

您并不总是关闭连接,并且使用新的客户端和传输每个请求。如果丢弃传输,则丢弃空闲池中的任何连接,从而泄漏这些资源。

来自文档

默认情况下,传输缓存连接以供将来重用.这可能在访问许多主机时留下许多打开的连接。可以使用传输的CloseIdleConnections方法以及MaxIdleConnsPerHost和DisableKeepAlives字段来管理此行为。 传输应该被重用,而不是根据需要创建。运输是安全的,以同时使用多个峡谷。

当没有错误时总是关闭响应体,并且总是重用传输。

票数 2
EN

Stack Overflow用户

发布于 2018-04-29 04:58:56

您的问题在于没有关闭响应体,在下面一行中:

代码语言:javascript
复制
_, err := httpClient.Get("https://api.ipify.org?format=json")

获取响应变量并关闭主体,如下所示:

代码语言:javascript
复制
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: 这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50081803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档