GC освобождает недостижимые объекты, но не знает, что достижимые данные уже бесполезны. Рост кеша, глобальных коллекций, callbacks, незавершённых задач и ссылок из исключений может удерживать память.
Что может вызывать утечку памяти, если есть garbage collector?
GC освобождает недостижимые объекты, но не знает, что достижимые данные уже бесполезны. Рост кеша, глобальных коллекций, callbacks, незавершённых задач и ссылок из исключений может удерживать память.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
GC освобождает недостижимые объекты, но не знает, что достижимые данные уже бесполезны. Рост кеша, глобальных коллекций, callbacks, незавершённых задач и ссылок из исключений может удерживать память.
Отдельно возможны утечки в C-расширениях и внешних ресурсах. Даже после освобождения объектов RSS не обязан сразу уменьшиться: allocator может сохранить страницы и испытывать фрагментацию. Сначала отличают рост живых объектов от удержания памяти процессом, затем сравнивают снимки и пути ссылок. Принудительный gc.collect не исправляет бесконечно растущий словарь или забытый ресурс. Для кешей и очередей задают пределы и жизненный цикл.