В каких случаях вызывается Garbage Collector

Ответ

Garbage Collector (GC) в Android вызывается автоматически, когда система обнаруживает нехватку памяти или когда объекты больше не имеют активных ссылок. Основные триггеры:

  1. Недостаток памяти – система пытается освободить место перед OutOfMemoryError.
  2. Сборка мусора по поколениям – чаще чистит молодые объекты (minor GC), реже – старые (major GC).
  3. Явный вызов System.gc() – но это лишь рекомендация, не гарантия.

Пример утечки (избегай!):

class LeakyActivity : Activity() {
    private val staticList = mutableListOf<Any>()

    override fun onCreate() {
        super.onCreate()
        staticList.add(this) // Активность не соберется, пока жива staticList!
    }
}

Ответ 18+ 🔞

А, слушай, про этот ваш Garbage Collector в Android! Ну, ёпта, история знакомая. Представь себе: у тебя в приложении куча объектов, как барахло в комнате подростка — носки, огрызки, пустые банки из-под энергетика. Пока места хватает, живёшь и не паришься. Но как только свободной памяти становится в обрез, система смотрит на этот бардак и говорит: «Э, сабака сука, так дело не пойдёт». Вот это и есть главный триггер — недостаток памяти. Система, как заботливая, но строгая мамка, начинает уборку, чтобы приложение не накрылось медным тазом с OutOfMemoryError.

Дальше, чувак, работает принцип сборки по поколениям. Это как на вечеринке: молодые объекты (только что созданные) — это гости, которые пришли, выпили стаканчик и сразу свалили. Их (minor GC) выметают часто и быстро. А старые объекты, которые уже давно в памяти сидят, — это как те дядьки, которые у дивана прикорнули. Их (major GC) тревожат реже, но зато с размахом.

Ну и есть, конечно, способ попросить систему убраться — явный вызов System.gc(). Но это, блядь, как попросить того же подростка прибраться в комнате. Ты можешь сто раз сказать, но гарантии, что он это сделает прямо сейчас, — доверия ебать ноль. Это всего лишь рекомендация, система её может вежливо проигнорировать.

А теперь, бля, главный цимес — как всё это проёбывают. Смотри, классическая утечка, от которой у любого нормального разработчика волнение ебать начинается.

class LeakyActivity : Activity() {
    private val staticList = mutableListOf<Any>()

    override fun onCreate() {
        super.onCreate()
        staticList.add(this) // Активность не соберется, пока жива staticList!
    }
}

Видишь этот кусок? Ни хуя себе логика! Ты свою Activity (это же окно, целая, бля, сущность!) пихаешь в статический список. И что получается? Активность должна была умереть, когда пользователь с неё ушёл, но статический список — это как маньяк-коллекционер, который никогда ничего не выпускает из рук. Ссылка жива, и Garbage Collector смотрит на это и говорит: «Ну, ты, пидарас шерстяной, сам виноват». И активность будет висеть в памяти вечно, как призрак, жрать ресурсы и медленно, но верно приводить к тому самому крашу. Вот это и есть пиздопроебибна ситуация в чистом виде.