Может ли поток быть корнем дерева Garbage Collector

«Может ли поток быть корнем дерева Garbage Collector» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, поток может быть корнем для сборщика мусора (GC). В Android/Java потоки всегда считаются активными корнями GC, пока они выполняются. Это означает, что все объекты, доступные из стека потока (например, локальные переменные), не будут собраны GC.

Пример:

fun startThread() {
    val heavyObject = HeavyObject() // Не будет собран, пока поток жив
    thread {
        heavyObject.doWork() // Используем heavyObject в потоке
        Thread.sleep(1000)
    }
}

Важные нюансы:

  1. Поток должен быть запущен (не просто создан)
  2. Объекты в стеке потока защищены от GC
  3. После завершения потока связанные объекты могут быть собраны
  4. Анонимные классы (Runnable) также удерживают ссылки на внешние объекты