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

Что очищает память в JVM?

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

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

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, но эффективная работа с памятью остаётся ответственностью разработчика.

Что очищает память в JVM? | PrepBro