1 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
這里發(fā)生了很多事情。
首先,使用 Go 版本 1.14.2,您的程序對我來說運(yùn)行良好。它似乎沒有泄漏內(nèi)存。
其次,即使我故意通過將循環(huán)大小增加到 100 并將結(jié)果保存在數(shù)組中來制造內(nèi)存泄漏,我也只使用了大約 100 MB 的內(nèi)存。
第三,您不應(yīng)該使用 Activity Monitor 或任何其他操作系統(tǒng)級別的工具來檢查 Go 程序中的內(nèi)存泄漏。操作系統(tǒng)內(nèi)存管理是一個(gè)非常復(fù)雜的話題,操作系統(tǒng)工具旨在幫助您確定程序如何影響整個(gè)系統(tǒng),而不是程序中發(fā)生了什么。
具體來說,macOS“Real Memory”(類似于 RSS,駐留集大?。┌ǔ绦虿辉偈褂玫僮飨到y(tǒng)尚未收回的內(nèi)存。當(dāng)垃圾收集器釋放內(nèi)存并告訴操作系統(tǒng)它不再需要該內(nèi)存時(shí),操作系統(tǒng)不會(huì)立即收回它。(為什么它以這種方式工作超出了這個(gè)答案的范圍。)此外,如果操作系統(tǒng)處于內(nèi)存壓力之下,它不僅可以收回程序已釋放的內(nèi)存,還可以收回(臨時(shí))程序的內(nèi)存仍在使用但“最近”沒有訪問過,以便另一個(gè)急需內(nèi)存的程序可以使用它。在這種情況下,即使進(jìn)程實(shí)際上并沒有使用更少的內(nèi)存,“Real Memory”也會(huì)減少。操作系統(tǒng)報(bào)告的任何統(tǒng)計(jì)數(shù)據(jù)都不會(huì)在此處為您提供幫助。
您需要使用像expvar和expvarmonGODEBUG=gctrace=1
這樣的原生 Go 設(shè)置或工具來查看垃圾收集器在做什么。
至于為什么你的程序在限制時(shí)會(huì)耗盡內(nèi)存,請記住,默認(rèn)情況下,Go 會(huì)構(gòu)建一個(gè)動(dòng)態(tài)鏈接的可執(zhí)行文件,并且僅讀取所有共享庫會(huì)占用大量內(nèi)存。嘗試使用靜態(tài)鏈接構(gòu)建您的應(yīng)用程序,CGO_ENABLED=0
看看是否有幫助。查看僅運(yùn)行 1 次循環(huán)迭代時(shí)它使用了多少內(nèi)存。
- 1 回答
- 0 關(guān)注
- 221 瀏覽
添加回答
舉報(bào)