2017-02-20 88 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

如果您立即需要內存,這是一種好方法,但強制刪除內存在所有編程語言中都是危險的。 –