Перейти к содержимому
На этой странице

Garbage Collector

Все темы Kotlin Developer

Каковы основные принципы работы механизма сборки мусора (garbage collector)?

В Kotlin/JVM сборкой мусора управляет JVM. На Android эту роль выполняет ART, а Kotlin/Native использует собственный сборщик. Ниже описаны общие принципы и особенности JVM.

  1. Отслеживание ссылок: Механизм сборки мусора отслеживает ссылки на объекты в программе. Объекты, на которые нет ссылок из корневого множества, считаются недостижимыми и могут быть удалены.

  2. Маркировка-удаление: Процесс сборки мусора включает этап маркировки, где все достижимые объекты помечаются, а затем удаляются недостижимые объекты.

  3. Оптимизации: JVM может использовать различные оптимизации для улучшения производительности сборки мусора, такие как параллельная или инкрементальная сборка, а также различные алгоритмы сборки мусора в зависимости от сценария использования приложения.

  4. Явный запрос: System.gc() просит JVM выполнить сборку мусора, но не гарантирует её запуск или освобождение нужного объёма памяти.


Какие существуют типы ссылок в механизме сборки мусора (garbage collector)?

В механизме сборки мусора существуют следующие типы ссылок:

  1. Strong References: Объект сохраняется, пока достижим от корней GC по цепочке сильных ссылок. Недостижимый цикл сильных ссылок может быть собран.

  2. Weak References: Не удерживают объект, если он больше не достижим через сильные или мягкие ссылки. Сборщик очищает слабые ссылки при обнаружении слабой достижимости.

  3. Soft References: Сборщик может очистить мягкие ссылки по своей политике. Все мягкие ссылки на мягко достижимые объекты очищаются перед OutOfMemoryError, но очистка возможна и раньше.

  4. Phantom References: Позволяют через ReferenceQueue отслеживать фантомную достижимость для очистки внешних ресурсов. get() всегда возвращает null; уведомление не подтверждает, что память объекта уже освобождена.


Какие типы ссылок существуют в механизме сборки мусора (garbage collector), включая сильные, слабые, мягкие и фантомные ссылки?

В механизме сборки мусора существуют четыре типа ссылок:

  1. Strong References: Объект сохраняется, пока достижим от корней GC по цепочке сильных ссылок. Недостижимый цикл сильных ссылок может быть собран.

  2. Weak References: Не удерживают объект, если он больше не достижим через сильные или мягкие ссылки. Сборщик очищает слабые ссылки при обнаружении слабой достижимости.

  3. Soft References: Сборщик может очистить мягкие ссылки по своей политике. Все мягкие ссылки на мягко достижимые объекты очищаются перед OutOfMemoryError, но очистка возможна и раньше.

  4. Phantom References: Позволяют через ReferenceQueue отслеживать фантомную достижимость для очистки внешних ресурсов. get() всегда возвращает null; уведомление не подтверждает, что память объекта уже освобождена.


С какими типами ссылок вы работали в механизме сборки мусора (garbage collector)?

Основные типы ссылок в механизме сборки мусора:

  1. Strong References (сильные ссылки): Используются по умолчанию в большинстве случаев. Обычно это обычные ссылки на объекты.

  2. Weak References (слабые ссылки): Часто используются для реализации кэшей или связанных со слабой ссылкой структур данных.

  3. Soft References (мягкие ссылки): Используются для кэширования данных, которые можно удалить из памяти, если нет необходимости.

  4. Phantom References: Позволяют через ReferenceQueue отслеживать фантомную достижимость для очистки внешних ресурсов. get() всегда возвращает null; уведомление не подтверждает, что память объекта уже освобождена.


Как работает сборщик мусора в Kotlin и чем он отличается от сборщика мусора в Java?

Kotlin/JVM и Java используют сборщик одной и той же JVM. Он освобождает память недостижимых объектов. Если ненужный объект остаётся достижимым, утечка памяти возможна и при наличии GC.

При запуске на одной JVM различий в механизме GC из-за языка нет. Это сравнение не распространяется на Kotlin/Native и другие целевые платформы Kotlin.


Какие типы объектов не могут быть собраны сборщиком мусора?

GC не собирает объекты, сильно достижимые от корней GC. Статическое поле может удерживать объект, пока сохраняется соответствующая достижимость; само наличие ссылок внутри недостижимой группы объектов не мешает сборке.


Объясните понятие "stop-the-world" в контексте сборки мусора.

Stop-the-world, или STW, означает приостановку потоков приложения в данной JVM на время определённой фазы GC. Другие JVM и приложения системы не останавливаются. Конкурентные сборщики выполняют часть работы одновременно с приложением, но также могут иметь STW-фазы.


Какие методы существуют для принудительной сборки мусора и когда их следует использовать?

В Kotlin/JVM и Java System.gc() отправляет запрос на сборку мусора. JVM не обязана выполнять его немедленно или освобождать конкретные объекты. Такой вызов не подходит для гарантированного освобождения памяти или внешних ресурсов; для ресурсов используют явное закрытие.

Собеседования: Kotlin

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: Kotlin-разработчик, Android-разработчик, Backend-разработчик на Kotlin. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.