我在包中有一个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