2014-12-16 2 views
3

Когда сервер запустился, память заняла около 83 МБ, которую я проверил на top. И когда некоторые соединения были приняты и что-то сделали, память заняла около 500 МБ, Затем я закрыл все соединения и сервер, чтобы очистить все структуры, после чего память немного уменьшилась, около 30 МБ. вернуться к уровню, когда сервер запустился.Почему не уменьшается память в golang?

, когда сервер начал, я посмотрел кучу информации

# runtime.MemStats 
# Alloc = 7251528 
# TotalAlloc = 52713992 
# Sys = 15010040 
# Lookups = 49 
# Mallocs = 2072338 
# Frees = 2038576 
# HeapAlloc = 7251528 
# HeapSys = 12025856 
# HeapIdle = 2121728 
# HeapInuse = 9904128 
# HeapReleased = 0 
# HeapObjects = 33762 
# Stack = 425984/425984 
# MSpan = 75504/81920 
# MCache = 4800/16384 
# BuckHashSys = 1457768 
# NextGC = 11496656 

И когда закрыты все соединения, через некоторое время и дс, я снова поднял

# runtime.MemStats 
# Alloc = 5845912 
# TotalAlloc = 13053679584 
# Sys = 73128248 
# Lookups = 794 
# Mallocs = 22728491 
# Frees = 22699056 
# HeapAlloc = 5845912 
# HeapSys = 60112896 
# HeapIdle = 52166656 
# HeapInuse = 7946240 
# HeapReleased = 0 
# HeapObjects = 29435 
# Stack = 3719168/3719168 
# MSpan = 88608/180224 
# MCache = 4800/16384 
# BuckHashSys = 1597264 
# NextGC = 9428528 

И я не знаю, почему это так мало. Потому что я уже очистил переменные, сохраненные на сервере. Кто-нибудь даст какой-нибудь совет о том, как я нахожу проблему?

PS. Он не заботится о горутине, я проверил ее, и количество горутинцев не увеличилось. И я уже использую pprof и открываю gcdebug.

+1

Возможный дубликат [Go 1.3 Сборщик мусора, не выпускающий серверную память обратно в систему] (http://stackoverflow.com/q/24376817/978917)? – ruakh

+0

что-то в этом роде, но я жду больше десяти часов, память остается больше 400 МБ, я в замешательстве и хочу знать, что заняло так много памяти. –

+0

@buzz: что смущает этот ответ? В настоящее время память стека не может быть освобождена. Вы используете go1.4? – JimB

ответ

4

Потому что это не совсем так, чтобы идти, чтобы сжать его собственную память. Сборщик мусора Go иногда вызывает запросы к ОС для освобождения неиспользуемой памяти. ОС может решить не выпускать память, потому что у системы есть что поделать, другая по другой причине.

Если вы действительно обеспокоены тем, что приложение принимает слишком много памяти или утечки памяти, обратите внимание на значение HeapAlloc с течением времени. Убедитесь, что это значение остается в ожидаемом диапазоне.

Кроме того, не ожидайте, что debug.FreeOSMemory() или runtime.GC() делать то, что вы ожидаете.