Как работает Garbage collector
Garbage Collector (GC) в Android управляет памятью вашего приложения, автоматически освобождая ресурсы, которые больше не используются. В Android используется механизм GC, основанный на Java Virtual Machine (JVM), с некоторыми особенностями, адаптированными для мобильных устройств. Garbage Collector в Android автоматически управляет памятью, удаляя объекты, которые больше не используются вашим приложением. Это освобождает память и предотвращает утечки памяти. Основная цель GC — поддерживать эффективное использование памяти и предотвращать её исчерпание.
Garbage Collection — это процесс, который освобождает память, занятую объектами, которые больше не нужны. В Android используется сборщик мусора, основанный на JVM. Основные элементы GC включают:
Heap: Это область памяти, где создаются и хранятся объекты. В Android heap делится на две части: основной (dalvik heap) и дополнительный (native heap).
Generational Collection: GC в Android использует концепцию генераций. Объекты, созданные недавно, размещаются в младшем поколении (young generation). Если объект переживает несколько сборок мусора, он перемещается в старшее поколение (old generation). Сборка мусора в младшем поколении происходит чаще, чем в старшем.
Mark-and-Sweep: Это основной алгоритм для определения, какие объекты нужно удалить. Он состоит из двух этапов:
Mark-and-Sweep (Отметь и очисти): Один из основных алгоритмов GC. Сначала происходит фаза "Mark", где отмечаются все объекты, доступные для приложения. Затем в фазе "Sweep" удаляются все неотмеченные объекты.
Mark-and-Compact (Отметь и уплотни): В этом алгоритме после фазы "Mark" идет фаза "Compact", где оставшиеся объекты уплотняются, чтобы освободить большие непрерывные блоки памяти и уменьшить фрагментацию.
Generational Collection: Это стратегия, основанная на предположении, что большинство объектов живут недолго. Молодое поколение очищается чаще, а старшее поколение — реже. Это помогает уменьшить время, затрачиваемое на сборку мусора, и улучшить производительность.
GC отслеживает, какие объекты в куче доступны и достижимы из корневых точек, таких как стековые переменные, статические переменные и активные потоки. Если объект не достижим из корневых точек, он считается неиспользуемым.
Сборка мусора может оказывать значительное влияние на производительность, особенно во время Major GC. Для минимизации этого влияния JVM и Android использует различные оптимизации, такие как:
+------------------+
| 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) |
+------------------+