2017-02-20 37 views
2

我在包中有一个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这就是为什么我开始使用它,在第一个答案有最后一个建议。

+0

“是清空够程用的是什么记忆的好办法”。答:不可以。远离这种黑客行为,特别是因为这些没有帮助。 – Volker

+0

@Volker首先,为什么我得到了一个投票?其次,那么什么是好方法? – PumpkinSeed

回答

4

Go运行时不会释放空闲内存回OS“立即”,这将是低效的。在这里阅读更多关于它的信息:Golang - Cannot free memory once occupied by bytes.Buffer

你应该让Go运行时处理这个。如果您的应用不稳定而未拨打debug.FreeOsMemory(),则存在更大的问题,即使“看起来”有所帮助,也不应该掩盖此问题。它甚至可能使事情变得更糟,就好像提供请求确实需要大量内存(在完成请求时由GC正确释放内存),调用FreeOsMemory()将仅将其返回到运行时必须要求的OS在服务另一个请求时再次分配/分配。如果您没有将它交还给操作系统,它将可用于下一个请求...

尝试减少请求处理程序的内存要求。如果这是不可能的(可疑),那么限制需要大容量内存的请求数量可以同时提供。

看到这个问题的答案+如何做到这一点:Process Management for the Go Webserver

另外:Is this an idiomatic worker thread pool in Go?

+0

谢谢,没有FreeOSMemory的服务稳定,我只是不知道是不是一个好方法。现在我对此有了线索。 – PumpkinSeed

3

GO lang清除所有未使用的内存,但不是中间内存。你可以阅读其他问题:

Golang - Cannot free memory once occupied by bytes.Buffer

+0

是的,我读到了,这就是为什么我开始使用这个软件包,但是由于主包名称而引起怀疑,那是它的好方法吗? – PumpkinSeed

+0

如果您立即需要内存,这是一种好方法,但强制删除内存在所有编程语言中都是危险的。 –