Перейти к содержимому
11 / 15

Профилирование памяти: где аллокации тратятся зря

Профиль кучи отвечает на два разных вопроса, и их важно не путать. inuse_space показывает, что занято сейчас — этим ищут утечки и понимают, чем занята память. alloc_space показывает, сколько выделено за всё время, включая давно освобождённое, — этим ищут давление на сборщик мусора: функция может ничего не удерживать, но выделять гигабайты в секунду, заставляя сборщик работать непрерывно. Для оптимизации почти всегда нужен второй. Собирается профиль так же, как процессорный: -memprofile у бенчмарка или /debug/pprof/heap у сервиса, причём эндпоинт по умолчанию отдаёт inuse, а для alloc нужен параметр. Типовые находки одинаковы во всех проектах: конкатенация строк в цикле, срез без предварительной ёмкости, конвертация []byte в string на горячем пути, и передача больших структур по значению. Быстрая проверка без всякого профиля — go test -bench=. -benchmem: столбец allocs/op часто указывает на проблему сразу.

Профилирование памяти: где аллокации тратятся зря | JScriptiser