Утечка памяти на Голанге при звонках на велосипеде - PullRequest
0 голосов
/ 30 октября 2018

Я выполняю вызов на удаленный сервер, поскольку в качестве агента этот вызов должен выполняться каждые 5 минут, но при тестировании я запускаю его каждую секунду. и я вижу утечку памяти, и пытаюсь ее решить. Суть кода заключается в следующем:

 // Set the initial payload to be sent
    payloadBytes, err := json.Marshal(data)
    if err != nil { log.Print("Failed Marshal", err) }
    transport := &http.Transport{ DisableKeepAlives: true }
    client := http.Client{Transport: transport}

    // Repeat the post call to the remote server
    repeatTicker := time.NewTicker(1 * time.Second)
    for {
       select {
       case <- repeatTicker.C:
           body := bytes.NewReader(payloadBytes)
           log.Print("Sending:", string(payloadBytes))
           postCycle(client, body)
       }
    }
    transport.CloseIdleConnections()
  }

func postCycle(client http.Client , body *bytes.Reader){
    resp, err := client.Post("http://mywebsite.io/api", "application/json", body)
    if err != nil { log.Print("Failed to Connect",err) }
    responseData, err := ioutil.ReadAll(resp.Body)
    if err != nil { log.Print("Response contains Errors", err) }
    resp.Body.Close()
}

Что я нахожу, транспорт открывается один раз и используется повторно, но resp.Body.Close (), похоже, не дает желаемого эффекта, и количество памяти продолжает расти. Возвращаемые данные являются эхом отправленных данных, поэтому они никогда не меняются. Я что-то здесь упускаю? или количество памяти увеличится и будет сохранено после сбора мусора?

1 Ответ

0 голосов
/ 31 октября 2018

Утечка памяти выглядела вероятной, но затем после выполнения процедуры в течение некоторого времени использование памяти было ограничено, так что это правильно для очистки объектов и не использования всей доступной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...