Golang 如何避免內存泄露
在 Golang 中,如果 goroutine 持有某些資源(如內存、文件描述符等)
但在其生命週期結束時未正確釋放這些資源,則可能會發生內存泄漏。
這通常是由於 goroutine 在退出時未能正確關閉通道或釋放鎖而引起的。
爲了避免內存泄漏,我們應該遵循以下幾個最佳實踐:
-
使用 defer 語句來確保在函數返回之前釋放資源
-
避免在 goroutine 中使用全局變量,因爲它們可能會在 goroutine 退出時未被正確釋放。
-
當使用通道時,請確保在不再需要它們時關閉它們。
-
當使用鎖時,請確保在不再需要它們時解鎖它們。
在 Golang 中內存泄露分爲暫時性內存泄露和永久性內存泄露。
暫時性內存泄露:
獲取長字符串中的一段導致長字符串未釋放
獲取長 slice 中的一段導致長 slice 未釋放
在長 slice 新建 slice 導致泄漏
string 相比切片少了一個容量的 cap 字段,可以把 string 當成一個只讀的切片類型。
獲取長 string 或者切片中的一段內容,由於新生成的對象和老的 string 或者切片共用一個內存空間,會導致老的 string 和切片資源暫時得不到釋放,造成短暫的內存泄漏
永久性內存泄露:
goroutine 永久阻塞而導致泄漏
time.Ticker 未關閉導致泄漏
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/PcMZb4ZTruRllyNtSqhKpQ