Почему Garbage Collector не может убить Activity на главном экране

Ответ

Activity на главном экране (например, MainActivity) не уничтожается GC, потому что на неё есть сильные ссылки из системы Android.

Ключевые причины:

  1. Activity хранится в стеке задач (back stack)
  2. На неё ссылается WindowManager через DecorView
  3. Жизненный цикл управляется системой, а не GC

Пример:

class MainActivity : AppCompatActivity() {
    // Активность удерживается системой пока видима
    override fun onCreate() {
        super.onCreate()
        setContentView(R.layout.activity_main)
    }
}

GC может собрать только Activity, на которую больше нет ссылок (например, после finish() и удаления из стека). Главная Activity всегда имеет активные ссылки, пока приложение запущено.

Ответ 18+ 🔞

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

Смотри, ёпта. Представь, что твоя MainActivity — это как будто ты сам, сидишь на своём любимом диване. Пока ты на этом диване сидишь, тебя же мусорщики (наш GC) не вынесут на помойку? Вот и система Android — она не дура, она тебя за жопу держит, пока ты ей нужен.

Почему так происходит, ёб твою мать:

  1. Стек задач (Back Stack). Это как очередь в столовую, только для экранов. Твоя главная активити — это первый в очереди, его всегда видно. Пока он в этой очереди, система за него цепляется мёртвой хваткой. Это ж её внутренняя кухня, она не отпустит просто так.

  2. WindowManager и его приблуды. Система рисует твоё окно через DecorView. Получается, на твою активити смотрит какой-то системный WindowManager и думает: "А, окно живое, надо держать". И держит. Пока окно висит, ссылка на активити есть. Доверия ебать ноль к тому, что она её отпустит.

  3. Жизненный цикл — это царь и бог. Тут не ты решаешь, когда активити помирать. Тут система командует парадом. Она говорит "onPause" — ты замираешь. Говорит "onDestroy" — только тогда начинается разговор о сборке мусора. А до этого — сиди и не рыпайся, терпения ноль ебать.

Вот смотри на этот кусок кода, тут всё честно:

class MainActivity : AppCompatActivity() {
    // Активность удерживается системой пока видима
    override fun onCreate() {
        super.onCreate()
        setContentView(R.layout.activity_main)
    }
}

Пока этот экран торчит у пользователя перед глазами, система за него отвечает. Это её ребёнок, она его не бросит.

А когда же её наконец-то съест GC? А вот тогда, когда на неё вообще нихуя не будет ссылаться. То есть ты вызвал finish(), система выпихнула её из стека задач, все вьюхи отцепила, и все остальные объекты про неё забыли. Вот тогда, сам от себя охуев, сборщик мусора подскочит и скажет: "А, свободная память! Пошла нахуй!". И очистит.

Но главная-то активити, пока приложение живо, почти всегда кому-то нужна. Так что да похуй на беспокойство — она под надёжным колпаком. Прямо как хитрая жопа, которая всегда выкрутится.