我在包中有一個tcp服務器使用goroutines。大多數情況下,響應非常重,但是當程序結束時,它不會從內存中清除。FreeOSMemory()正在生產
func Handle() {
service := ":7777"
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)
defer listener.Close()
for {
conn, err := listener.Accept()
checkError(err)
go handleRequest(conn, db)
}
}
func handleRequest(conn net.Conn, db *sql.DB) {
message := make([]byte, 0, 4096)
tmp := make([]byte, 256)
n, err := conn.Read(tmp)
if err != nil {
if err != io.EOF {
fmt.Println("read error:", err)
}
}
message = append(message, tmp[:n]...)
fmt.Println("Message Received:", string(message))
// do something to get resp
conn.Write(append(resp, []byte("\n")...))
conn.Close()
debug.FreeOSMemory()
return
}
因此,在這種情況下,響應大,和一個夠程使用的內存的10%,那沒關係,因爲我得到從數據庫170.000用戶和解析結果JSON。但是,當handleRequest和它仍然在內存中,如果我不使用debug.FreeOsMemory()
。我懷疑這是一種很好的方法,因爲它在調試平臺中,所以我的問題是清空內存什麼是goroutines的好方法?我對它進行了測試,因此它對系統沒有影響,並且運行良好。如果不是,那麼好的方法是什麼?我不能等待GC來清除它?!我讀this這就是爲什麼我開始使用它,在第一個答案有最後一個建議。
「是清空夠程用的是什麼記憶的好辦法」。答:不可以。遠離這種黑客行爲,特別是因爲這些沒有幫助。 – Volker
@Volker首先,爲什麼我得到了一個投票?其次,那麼什麼是好方法? – PumpkinSeed