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的goroutine(我通过runtime.NumGoroutine()对其进行了检查)。启动后,应用程序在4个周期后使用了100mb左右,超过1GB

Github所有代码的仓库

最佳答案

您的问题在于,在此行中没有关闭响应主体:

_, 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}

在文档The client must close the response body when finished with it: here

关于go - Goroutines内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50081803/

10-13 01:55