Go 1.3 垃圾收集器未將伺服器記憶體釋放回系統
開發用於檢查記憶體佔用的伺服器顯示RES 記憶體波動,儘管預期記憶體釋放連線激增後。這個問題的出現是由於 Go 垃圾收集器在立即釋放堆疊記憶體方面的限制以及作業系統無法存取 goroutine 堆疊記憶體。類 Unix 系統中用於釋放未使用的堆部分的系統呼叫在 Windows 上不可用,從而導致潛在的更大的虛擬記憶體消耗。
最初,伺服器以較小的記憶體印記啟動。在 10,000 個連接的初始脈衝期間,記憶體使用量上升到大約 60MB(如「頂部」中的 RES 大小所示)。當脈衝結束時,記憶體使用量減少。然而,RES 大小仍保持在 56MB,而正在使用的記憶體永遠不會低於 60MB。
雖然 Go 垃圾收集器釋放堆內存,但它不會立即將其返回給系統。 GC 掃描後,此過程可能最多需要七分鐘。此外,分配給 goroutine 堆疊的記憶體永遠不會釋放給作業系統。這導致了在伺服器中觀察到的持續高記憶體消耗。
不幸的是,Go 版本 1.3 中沒有明確的解決方案來解決此問題。不過,這種情況預計會在後續版本中得到改善。為了減輕影響,請考慮以下措施:
以上是為什麼 Go 1.3 在連線高峰後不將伺服器記憶體釋放回系統?的詳細內容。更多資訊請關注PHP中文網其他相關文章!