Как работает Garbage collector

Garbage Collector (GC) в Android управляет памятью вашего приложения, автоматически освобождая ресурсы, которые больше не используются. В Android используется механизм GC, основанный на Java Virtual Machine (JVM), с некоторыми особенностями, адаптированными для мобильных устройств. Garbage Collector в Android автоматически управляет памятью, удаляя объекты, которые больше не используются вашим приложением. Это освобождает память и предотвращает утечки памяти. Основная цель GC — поддерживать эффективное использование памяти и предотвращать её исчерпание.

Garbage Collection — это процесс, который освобождает память, занятую объектами, которые больше не нужны. В Android используется сборщик мусора, основанный на JVM. Основные элементы GC включают:

  1. Heap: Это область памяти, где создаются и хранятся объекты. В Android heap делится на две части: основной (dalvik heap) и дополнительный (native heap).

  2. Generational Collection: GC в Android использует концепцию генераций. Объекты, созданные недавно, размещаются в младшем поколении (young generation). Если объект переживает несколько сборок мусора, он перемещается в старшее поколение (old generation). Сборка мусора в младшем поколении происходит чаще, чем в старшем.

  3. Mark-and-Sweep: Это основной алгоритм для определения, какие объекты нужно удалить. Он состоит из двух этапов:

    • Mark: Определяет, какие объекты доступны и используются.
    • Sweep: Удаляет объекты, которые не были отмечены как доступные.

Алгоритмы GC

  1. Mark-and-Sweep (Отметь и очисти): Один из основных алгоритмов GC. Сначала происходит фаза "Mark", где отмечаются все объекты, доступные для приложения. Затем в фазе "Sweep" удаляются все неотмеченные объекты.

  2. Mark-and-Compact (Отметь и уплотни): В этом алгоритме после фазы "Mark" идет фаза "Compact", где оставшиеся объекты уплотняются, чтобы освободить большие непрерывные блоки памяти и уменьшить фрагментацию.

  3. Generational Collection: Это стратегия, основанная на предположении, что большинство объектов живут недолго. Молодое поколение очищается чаще, а старшее поколение — реже. Это помогает уменьшить время, затрачиваемое на сборку мусора, и улучшить производительность.

Как Garbage collector понимает что объекты в куче можно удалять

GC отслеживает, какие объекты в куче доступны и достижимы из корневых точек, таких как стековые переменные, статические переменные и активные потоки. Если объект не достижим из корневых точек, он считается неиспользуемым.

Влияние на производительность

Сборка мусора может оказывать значительное влияние на производительность, особенно во время Major GC. Для минимизации этого влияния JVM и Android использует различные оптимизации, такие как:

  • Инкрементальная сборка мусора: Разделяет сборку мусора на несколько меньших частей, чтобы уменьшить паузы.
  • Concurrent Garbage Collection: Проводит сборку мусора параллельно с выполнением приложения, чтобы уменьшить задержки.
  +------------------+
  |    Application   |
  +------------------+
          |
          v
  +------------------+
  |     Heap Memory   |
  |  +--------------+ |
  |  |  Young Gen   | |   (Eden Space, Survivor S0, Survivor S1)
  |  +--------------+ |
  |  +--------------+ |
  |  | Old Gen       | |   (Long-lived objects)
  |  +--------------+ |
  +------------------+
          |
          v
  +------------------+
  |   GC Algorithms  |
  |  +------------+  |
  |  | Mark-and-  |  |   (Mark objects as reachable)
  |  | Sweep       |  |   (Sweep unreachable objects)
  |  | Mark-and-  |  |
  |  | Compact    |  |   (Compact memory to reduce fragmentation)
  |  +------------+  |
  |  +------------+  |
  |  | Concurrent |  |
  |  | Mark-and-  |  |   (Perform GC concurrently with app)
  |  | Sweep (CMS)|  |
  |  | Garbage    |  |
  |  | First (G1) |  |
  |  +------------+  |
  +------------------+
          |
          v
  +------------------+
  |   Free Memory    |
  |   (Reclaimed)    |
  +------------------+
  • Application: Ваше приложение создаёт объекты, которые размещаются в памяти кучи (Heap Memory).
  • Heap Memory:
    • Young Generation (Молодое поколение):
      • Eden Space: Здесь создаются новые объекты.
      • Survivor Space (S0 и S1): Хранятся объекты, которые пережили одну или несколько сборок мусора.
    • Old Generation (Старшее поколение): Хранятся долгоживущие объекты, которые пережили несколько сборок мусора в молодом поколении.
  • GC Algorithms:
    • Mark-and-Sweep: Отметка доступных объектов и очистка недоступных.
    • Mark-and-Compact: Уплотнение памяти после отметки объектов.
    • Concurrent Mark-and-Sweep (CMS): Выполняет сборку мусора параллельно с выполнением приложения.
    • Garbage First (G1): Делит кучу на регионы и собирает мусор с целью уменьшения пауз и улучшения времени отклика.
  • Free Memory: Освобождённая память становится доступной для новых объектов.