go http 服务器和 fasthttp 中的内存泄漏
Memory leak in go http server and fasthttp
我的代码是一个简单的 fasthttp 服务器,就像它的 github 示例一样
但那有一个未知的内存泄漏。
然后我试图找到它并清除我的代码,它又出现了这个问题。
然后我 运行 只是官方的例子,甚至有内存泄漏(这意味着我在 windows 进程管理器上观察内存使用情况,它使用的内存在负载中增长并且不会甚至在一段时间后释放,直到我的 windows 崩溃)。
然后我通过一个非常简单的 hello world 服务器使用了 std net/http,我又遇到了那个问题。我的内存使用量随着每个请求而增长,而 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)
}
}
根据Go http.Request documentation
// The Server will close the request body. The ServeHTTP
// Handler does not need to.
因此您应该删除 r.Body.Close()
调用,因为它不需要。
这不是库的原因,也不是错误。
这是 GC 行为的原因。它不是内存泄漏。
多研究一下 Go 的 GC 是如何工作的就明白了,完全不用担心。
我的代码是一个简单的 fasthttp 服务器,就像它的 github 示例一样 但那有一个未知的内存泄漏。 然后我试图找到它并清除我的代码,它又出现了这个问题。
然后我 运行 只是官方的例子,甚至有内存泄漏(这意味着我在 windows 进程管理器上观察内存使用情况,它使用的内存在负载中增长并且不会甚至在一段时间后释放,直到我的 windows 崩溃)。
然后我通过一个非常简单的 hello world 服务器使用了 std net/http,我又遇到了那个问题。我的内存使用量随着每个请求而增长,而 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)
}
}
根据Go http.Request documentation
// The Server will close the request body. The ServeHTTP
// Handler does not need to.
因此您应该删除 r.Body.Close()
调用,因为它不需要。
这不是库的原因,也不是错误。 这是 GC 行为的原因。它不是内存泄漏。 多研究一下 Go 的 GC 是如何工作的就明白了,完全不用担心。