公司一個項目中需實現如下功能:mongodb
實現思路大體以下:測試
程序運行一段時間後發現系統變的巨卡,查看進程管理髮現此進程佔用大部份內存,再次估計是發生內存泄露,開始查找問題.
在程序中加入內存消耗分析日誌
fm, err := os.OpenFile("./mem.out", os.O_RDWR|os.O_CREATE, 0644) if err != nil { log.Fatal(err) } pprof.WriteHeapProfile(fm) fm.Close()
分析後發現大部份內存分配在watcher.WaitForFileChange()內部,而後繼續使用net/http/pprofcode
_ net/http/pprof go func() { http.ListenAndServe("localhost:6060", nil) }()
使用網頁查看,發現有大量的goroutine阻塞於watcher.WaitForFileChange().至此發現是由於文件監視當文件發生改變後沒有返回,致使大量goroutine阻塞於這裏.進程
後測試發現文件監視這個包必定狀況下存在這個問題,後改用文件鎖替代,運行一段時間後沒有出現泄漏,至此問題解決.內存