Почему нельзя самому следить за памятью

Ответ

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

  1. Сложность — легко пропустить освобождение ресурсов, что приведёт к утечкам.
  2. Неэффективность — GC оптимизирован под работу с кучей и учитывает жизненный цикл приложения.
  3. Непредсказуемость — ручное управление может нарушить работу GC и вызвать лаги.

Пример утечки:

class LeakyActivity : Activity() {
    private val listener = object : SomeListener {
        override fun onEvent() = Unit
    }

    override fun onCreate() {
        SomeSingleton.register(listener) // Утечка: listener держит Activity
    }
}

Используйте WeakReference или Lifecycle-aware компоненты (например, LiveData).

Ответ 18+ 🔞

А, ну это классика, блядь! Слушай, тут про память в Андроиде, ебать мои старые костыли. Ситуация такая: у тебя там есть этот самый Garbage Collector (GC), типа уборщик-автомат. Он ходит, смотрит — о, этот объект уже никто не трогает, все на него забили, хуй с горы — и выкидывает его из памяти. Всё за тебя делает, красота.

А некоторые умники думают: «А давайте я сам, своими кривыми ручками, буду памятью рулить! Я ж гений!». И вот тут начинается пиздец, чувак.

Во-первых, сложность — овердохуища. Ты же забудешь, блядь, где что чистить надо. Закроешь одно активити, а слушатель какой-нибудь останется висеть, как призрак, и будет твоё приложение изнутри жрать память, как не в себя. Доверия ебать ноль к себе в таких делах.

Во-вторых, неэффективность. Этот GC — он не дурак, он под всю систему заточен. Он знает, когда лучше прибраться, чтобы тебе лагов не было. А ты со своим ручным управлением влезешь, начнёшь костылить — и всё, привет, тормоза. Пизда рулю, короче.

В-третьих, непредсказуемость. Ты можешь так накосячить, что GC вообще офигеет и начнёт срабатывать в самые неподходящие моменты. А потом пользователь пишет в отзывы: «Приложение лагает, пидарас шерстяной!». А это всё ты, со своим «ручным управлением».

Вот, смотри, живой пример, как эту утечку организовать — подозрение ебать чувствую, что многие так и делают:

class LeakyActivity : Activity() {
    private val listener = object : SomeListener {
        override fun onEvent() = Unit
    }

    override fun onCreate() {
        SomeSingleton.register(listener) // Вот она, мать её, утечка!
    }
}

Видишь? Ты в синглтон, который живёт вечно, зарегистрировал слушателя из активити. Активити закрылось, а синглтон держит ссылку на этого listener, а тот, в свою очередь, держит ссылку на всю твою LeakyActivity. И она не может быть собрана, висит мёртвым грузом. Ядрёна вошь! Так и набираются эти утечки, пока приложение не накроется медным тазом.

Так что не выёбывайся, э бошка думай. Используй нормальные инструменты: WeakReference (слабая ссылка, она не помешает GC всё почистить) или, что лучше, компоненты, которые с жизненным циклом дружат — те же LiveData, например. Они сами всё отпишут и почистят, когда надо. Не изобретай велосипед, чувак, его уже до тебя изобрели.