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

Какой алгоритм использует Garbage Collectors?

2.0 Middle🔥 141 комментариев
#JVM и память#Производительность и оптимизация

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

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

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

📚 Обзор алгоритмов сборки мусора (Garbage Collection) в Android

В Android, начиная с версии 4.4 (KitKat), сборка мусора осуществляется преимущественно с помощью ART (Android Runtime), который заменил Dalvik. ART использует гибридные алгоритмы, адаптированные под мобильные устройства, где критичны память, производительность и энергоэффективность. Вот основные алгоритмы, применяемые в современных Android-устройствах:


🧠 Основные алгоритмы сборки мусора

1. Generational Garbage Collection (Поколенная сборка)

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

  • Young Generation (Молодое поколение): Новые объекты размещаются здесь.
  • Old Generation (Старое поколение): Объекты, пережившие несколько сборок.
  • Permanent Generation (Постоянное поколение): Метаданные классов (в Android заменено на область под хранение классов).

Для каждого поколения используются разные алгоритмы:

  • Молодое поколение: Copying Collector – быстрая сборка, копирование выживших объектов.
  • Старое поколение: Mark-Sweep-Compact – более медленная, но эффективная для долгоживущих объектов.
// Пример: создание объектов разного времени жизни
void exampleGenerational() {
    // Молодой объект (скорее всего умрёт в Young GC)
    String temp = "Временный объект";
    
    // Долгоживущий объект (может попасть в Old Generation)
    static List<String> persistentList = new ArrayList<>();
    persistentList.add("Долгожитель");
}

2. Concurrent Mark-Sweep (CMS)

Этот алгоритм старается минимизировать stop-the-world паузы, выполняя часть работы параллельно с выполнением приложения:

  • Фаза маркировки выполняется параллельно.
  • Фаза очистки также может быть частично параллельной.
  • Не сжимает память, что может привести к фрагментации.

В Android ART используется Concurrent Copying (CC) сборщик, который является развитием CMS, оптимизированным для мобильных устройств.

3. Hybrid Approaches в Android ART

Современный ART (начиная с Android 8.0) использует гибридный подход:

// Современный Android оптимизирует сборку под разные сценарии
class MemoryIntensiveTask {
    fun process() {
        // В фоновом потоке может использоваться concurrent сборка
        val data = ByteArray(1024 * 1024) // 1MB временный объект
        
        // При нехватке памяти система выберет оптимальный алгоритм
        // Например, foreground сборку с минимальными паузами
    }
}

🔧 Эволюция алгоритмов в Android

Версия AndroidСреда выполненияОсновные алгоритмы
До 4.4Dalvik VMMark-Sweep, частичная compaction
4.4-7.xARTGenerational + Concurrent Mark-Sweep
8.0+ART улучшенныйConcurrent Copying (CC) для большинства случаев

⚡ Оптимизации под мобильные устройства

Android-сборщик мусора включает специфические оптимизации:

  1. Область перемещения (Region-based) – память делится на регионы для более эффективного управления.
  2. Фоновые сборки – выполнение GC в фоновых потоках, когда приложение не активно.
  3. Джоб-ориентированная архитектура – разные типы сборок (молодая, полная, фоновая) запускаются как отдельные задачи.
  4. Адаптивные эвристики – система анализирует поведение приложения и выбирает оптимальную стратегию.
// На низком уровне ART использует подобные структуры
struct GcType {
    bool concurrent;  // Флаг параллельности
    bool young_only;  // Только молодое поколение
    bool full;        // Полная сборка
};

// Система выбирает тип сборки на основе эвристик
GcType chooseGcType(HeapState state, AppState app) {
    if (app.is_in_background) {
        return {.concurrent = true, .young_only = false, .full = true};
    } else if (state.young_gen_almost_full) {
        return {.concurrent = false, .young_only = true, .full = false};
    }
    // ... другие условия
}

🎯 Практические рекомендации для разработчиков

  1. Избегайте утечек памяти – используйте WeakReference для кэшей.
  2. Минимизируйте создание объектов в циклах – особенно в onDraw().
  3. Используйте пулы объектов для часто создаваемых/удаляемых объектов.
  4. Будьте осторожны с обработчиками событий – отписывайтесь в onDestroy().
// Пример оптимизации с пулом объектов
object BitmapPool {
    private val pool = Stack<Bitmap>()
    
    fun getBitmap(): Bitmap {
        return if (pool.isEmpty()) {
            Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
        } else {
            pool.pop().apply { eraseColor(Color.TRANSPARENT) }
        }
    }
    
    fun recycle(bitmap: Bitmap) {
        if (pool.size < 10) {
            pool.push(bitmap)
        } else {
            bitmap.recycle()
        }
    }
}

Итог: Android использует сложную гибридную систему GC, сочетающую поколенную сборку, параллельные алгоритмы и адаптивные стратегии, чтобы балансировать между производительностью, использованием памяти и отзывчивостью UI. Понимание этих механизмов помогает писать более эффективные приложения с предсказуемым потреблением памяти.

Какой алгоритм использует Garbage Collectors? | PrepBro