Что очищает память в JVM?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Garbage Collection в JVM: очистка памяти
Память в JVM очищает Garbage Collector (GC) — автоматический механизм управления памятью. В отличие от языков вроде C++, где программист вручную освобождает память через delete, в Java и Android это делает GC автоматически, что делает разработку безопаснее и быстрее.
Как работает Garbage Collection
GC отслеживает все объекты в памяти и удаляет те, на которые нет ссылок (недостижимые объекты). Процесс состоит из двух фаз:
1. Mark (пометка)
- GC начинает со "корневых" ссылок: локальные переменные, статические переменные, потоки
- Рекурсивно помечает все объекты, до которых можно добраться
- Немеченные объекты считаются мусором
2. Sweep (очистка)
- Удаляет немеченные объекты
- Опционально: Compact — уплотняет кучу для лучшей локальности кеша
Типы Garbage Collectors в Java
// Молодое поколение (Young Generation)
// Serial GC — однопоточный, для однопроцессорных систем
// Parallel GC — многопоточный, для максимальной пропускной способности
// G1 GC — разбивает кучу на регионы, предсказуемые паузы
// Старое поколение (Old Generation)
// CMS (Concurrent Mark Sweep) — минимизирует паузы
// G1GC — одинаково хорошо для обоих поколений
Поколенческая сборка мусора (Generational GC)
Большинство объектов живут недолго. GC использует эту гипотезу:
- Young Generation: новые объекты → частые, быстрые сборки мусора
- Old Generation: долгоживущие объекты → редкие, долгие сборки мусора
- Permanent/MetaSpace: метаинформация о классах
Это намного эффективнее, чем сканировать всю кучу целиком.
Memory Leaks в Java/Android
Есть одно исключение: если объект остаётся достижимым через ссылку, но не используется, — это утечка памяти. Частые случаи:
- Static ссылки:
static Activity mActivityбудет держать Activity вечно - Внутренние классы: анонимный класс содержит неявную ссылку на outer класс
- Listeners/Callbacks: забыли отписаться от событий
- Handler.postDelayed(): сообщение в очереди сохраняет ссылку на Handler → Activity
Контроль GC в Android
// Явный вызов (НЕ рекомендуется)
System.gc() // Совет для GC, но не гарантия
// Мониторинг в Android Studio
// Profiler → Memory tab → смотреть граммы памяти
// LeakCanary — автоматическое обнаружение утечек
// Лучшие практики
- Избегай глобальных/static ссылок на контекст или Activity
- Отписывайся от событий в onDestroy()
- Используй WeakReference для кеша, если нужно
- Переиспользуй объекты (Object pooling) в performance-critical коде
Паузы GC и производительность
Когда GC работает, приложение приостанавливается ("Stop The World"). Это особенно заметно на мобильных устройствах и вызывает jank (пропадание кадров). Поэтому в Android нужно минимизировать количество создаваемых объектов, особенно в onDraw(), onMeasure() и игровых циклах.
Garbage Collection — это фундамент безопасности памяти в Java, но эффективная работа с памятью остаётся ответственностью разработчика.