Golang 如何避免內存泄露

在 Golang 中,如果 goroutine 持有某些資源(如內存、文件描述符等)

但在其生命週期結束時未正確釋放這些資源,則可能會發生內存泄漏。

這通常是由於 goroutine 在退出時未能正確關閉通道或釋放鎖而引起的。

爲了避免內存泄漏,我們應該遵循以下幾個最佳實踐:

  1. 使用 defer 語句來確保在函數返回之前釋放資源

  2. 避免在 goroutine 中使用全局變量,因爲它們可能會在 goroutine 退出時未被正確釋放。

  3. 當使用通道時,請確保在不再需要它們時關閉它們。

  4. 當使用鎖時,請確保在不再需要它們時解鎖它們。

在 Golang 中內存泄露分爲暫時性內存泄露和永久性內存泄露。

暫時性內存泄露:

獲取長字符串中的一段導致長字符串未釋放

獲取長 slice 中的一段導致長 slice 未釋放

在長 slice 新建 slice 導致泄漏

string 相比切片少了一個容量的 cap 字段,可以把 string 當成一個只讀的切片類型。

獲取長 string 或者切片中的一段內容,由於新生成的對象和老的 string 或者切片共用一個內存空間,會導致老的 string 和切片資源暫時得不到釋放,造成短暫的內存泄漏

永久性內存泄露:

goroutine 永久阻塞而導致泄漏

time.Ticker 未關閉導致泄漏

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/PcMZb4ZTruRllyNtSqhKpQ