Goroutine не возвращает память в ОС - PullRequest
0 голосов
/ 10 марта 2020

Я хочу убедиться, что мой модуль не перезапускается, когда не хватает памяти. Теперь я вижу, что контейнер имеет низкое использование heapMem, но использование SysMem увеличилось до 4 Гб и не уменьшается с heapMem. Я считаю, что G C должен был вернуть это в ОС.

enter image description here

Статистика Прометея, используемая для мониторинга go_memstats_alloc_bytes и go_memstats_sys_bytes. Я также вижу, что go_memstats_gc_cpu_fraction не увеличивается со временем.

Я что-то упустил? Возможна ли утечка памяти?

1 Ответ

3 голосов
/ 10 марта 2020

Это не похоже на утечку памяти из графика, просто временное использование большего количества памяти. Обратите внимание, что после G C освобожденная память не будет возвращена ОС (немедленно), если она понадобится снова. Если у вас был один временный скачок в использовании памяти, он будет возвращен в ОС с течением времени.

В некоторых системах он может быть доступен только для ОС, которая может его не принимать, если только это не требуется в другом месте. (Это было отмечено в комментариях, но я не хотел вдаваться в подробности, чтобы избежать путаницы.)

Вы можете принудительно вернуть освобожденную память, используя debug.FreeOSMemory().

...