← Назад к вопросам

Может ли сборщик мусора убить Activity, которая показывается пользователю?

2.3 Middle🔥 111 комментариев
#JVM и память#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Краткий ответ

Нет, сборщик мусора (Garbage Collector, GC) не может уничтожить активную Activity, которая в данный момент показывается пользователю и находится в состоянии Resumed (или Started). Это противоречит жизненному циклу Activity и механизму работы Android.

Подробное объяснение

1. Управление памятью Activity в Android

Activity управляется системой Android, а не напрямую виртуальной машиной (VM). Уничтожение Activity — это системное решение, а не результат работы GC. Система хранит сильные ссылки на активные компоненты приложения (Activity, Service и т.д.), пока они находятся в соответствующих состояниях жизненного цикла.

Пока Activity находится на вершине стека (или в стеке) и видна пользователю, система будет удерживать на неё ссылки в компонентах ActivityManagerService и WindowManager. Эти ссылки находятся вне кучи (heap) вашего приложения, в системном процессе.

2. Когда GC может повлиять на Activity?

Сборщик мусора работает в пределах кучи вашего приложения. Он может собрать объекты, на которые нет достижимых сильных ссылок в вашем Java/Kotlin коде. Однако сама Activity как объект удерживается системными механизмами.

Главное исключение и потенциальная путаница возникает, когда система Android сама уничтожает Activity (например, из-за нехватки памяти, изменения конфигурации или вызова finish()), а затем GC очищает память, занимаемую уже уничтоженной Activity. Но это следствие, а не причина.

3. Жизненный цикл и ссылки

Рассмотрим типичный сценарий:

class MainActivity : AppCompatActivity() {
    private val someData = HeavyDataObject()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // Пока Activity в стеке и активна, система держит на неё сильную ссылку
        // someData также защищён от GC, так как на него есть ссылка из Activity
    }
}

Пока Activity находится в состоянии:

  • Resumed (активна и видна)
  • Started (частично видна или фоновая)

система гарантирует её существование. Если система решает освободить ресурсы, она сначала вызовет callback'и жизненного цикла (onPause(), onStop(), onDestroy()), и только после этого может быть собрана GC.

4. Случаи "гибели" активной Activity

Activity может исчезнуть с экрана не из-за GC, а из-за:

  • Системного убийства процесса при нехватке памяти (Low Memory Killer).
  • Изменения конфигурации (поворот экрана) — старая Activity уничтожается, создаётся новая.
  • Явного вызова finish().
  • Перехода к другой Activity.

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

5. Проверка на практике

Вы можете убедиться в этом, добавив финализатор:

class MainActivity : AppCompatActivity() {
    
    override fun onResume() {
        super.onResume()
        Log.d("GC_TEST", "Activity активна")
    }
    
    protected fun finalize() {
        // Этот метод вызовется при сборке GC
        Log.d("GC_TEST", "Activity собрана GC!")
    }
}

При работе приложения вы не увидите сообщение "Activity собрана GC!", пока она на экране. Оно может появиться только после onDestroy() и при условии, что GC выполнит сборку.

Вывод

Сборщик мусора не является активным "убийцей" живых компонентов. Он лишь очищает память от объектов, которые уже не используются. Управление жизненным циклом Activity — прерогатива системы Android. Пока Activity находится в активном состоянии (Resumed/Started), система гарантированно удерживает её в памяти. Уничтожение происходит только через предусмотренные механизмы жизненного цикла, после чего освободившаяся память может быть переиспользована, в том числе с помощью GC.