Утечка памяти в go http server и fasthttp

Мой код был простым сервером fastthttp, как и его примеры на github, но с неизвестной утечкой памяти. Затем я попытался найти его и очистил свои коды, и у него снова возникла эта проблема.

Затем я запустил только официальный пример, и даже у него была утечка памяти (это означает, что я наблюдаю за использованием памяти в диспетчере процессов Windows, и его используемая память растет в нагрузках и не запускается даже через некоторое время, пока мои окна не сломались).

Затем я использовал std net/http очень простым сервером hello world, и у меня снова возникла эта проблема. Использование памяти увеличивается с каждым запросом, и Go не освобождает его.

Моя версия Go 1.11.2 Windows/ AMD64

и это мой код, который имеет эту проблему:

package main

import (
    "net/http"
    "strings"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
    message := r.URL.Path
    message = strings.TrimPrefix(message, "/")
    message = "Hello " + message
    w.Write([]byte(message))
    r.Body.Close()
}
func main() {
    http.HandleFunc("/", sayHello)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

3 ответа

Согласно документации Go http.Request

// The Server will close the request body. The ServeHTTP
// Handler does not need to.

Так что вы должны удалить r.Body.Close() звоните, так как это не нужно.

Через некоторое время и проведя длительный тест, я обнаружил, что это не утечка памяти, и это вызвано опцией tcp keep-alive, и go будет обрабатывать их автоматически, но если вы хотите снизить использование памяти, вам нужно сократить продолжительность времени поддержания активности на сервере параметры.

это не было причиной библиотеки и не было ошибкой. это причина поведения GC. это не утечка памяти. узнайте больше о том, как работает сборщик мусора Go, чтобы понять и ни о чем не беспокоиться.

Другие вопросы по тегам