Ответ вслух Senior ARC и циклы ссылок обновлено

ARC и сборка мусора: сравнение

Вопрос

Чем ARC в Swift отличается от сборщика мусора в Java/Kotlin, какие плюсы и минусы?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

ARC это подсчёт ссылок, который вставляет компилятор: при копировании ссылки retain, при исчезновении release. Объект уничтожается ровно тогда, когда исчезла последняя сильная ссылка, поэтому deinit предсказуем, ресурсы освобождаются сразу, а пауз сборщика нет.

Что должно прозвучать в ответе

  • ARC: подсчёт ссылок вставляется компилятором, освобождение детерминированное

  • Нет пауз сборщика и фоновых потоков, `deinit` вызывается сразу

  • Минус: циклы не собираются, ответственность на разработчике (`weak`/`unowned`)

  • Минус: атомарные retain/release стоят времени, компилятор их частично убирает

  • GC: собирает циклы, но паузы и выше пиковое потребление памяти

Что могут спросить следом

  • Как оптимизатор уменьшает количество retain/release?
  • Почему на мобильных устройствах детерминированность памяти важна?

Разбор

ARC это подсчёт ссылок, который вставляет компилятор: при копировании ссылки retain, при исчезновении release. Объект уничтожается ровно тогда, когда исчезла последняя сильная ссылка, поэтому deinit предсказуем, ресурсы освобождаются сразу, а пауз сборщика нет. Это важно на телефоне: памяти мало, и система убивает приложение за превышение лимита, а лишний пик памяти от отложенной сборки опасен. Минусы: циклы ARC не видит, их разрывает разработчик через weak и unowned. Плюс счётчики атомарные, и в горячем коде retain/release заметны в профиле, хотя оптимизатор многие пары убирает. Сборщик мусора в JVM собирает циклы сам и делает аллокации дешёвыми, но платит паузами и большим пиковым потреблением.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.