Сборщики мусора: часть 1. Обзор
Сборка мусора — фоновый процесс в JVM, который удаляет уже ненужные объекты. В основном каждая реализация балансирует между двумя параметрами:
🔹Latency: максимальное время обработки запроса
🔹Пропускная способность: сколько запросов обработается в минуту
"Запрос" здесь - взаимодействие приложения с памятью: создание, обновление и удаление объектов.
Приоритет зависит от приложения:
▪️Для веб-сервисов большие задержки недопустимы. Лучше в среднем ответ будет на четверть секунды дольше, но не будет подвисших запросов.
▪️Приложение работает в фоновом режиме. Например, архивирует записи. Не критично, если каждая сотая запись будет архивироваться 5 секунд, если за час обработается больше данных.
Алгоритм коллектора везде один и тот же:
🔸Отмечаем объекты, которые нужны
🔸Помечаем остальные объекты на удаление
🔸Удаляем ненужные объекты
🔸Группируем выжившие
Чтобы понять, какие объекты нужны приложению, строится граф достижимых объектов. Самостоятельные объекты называются roots и существуют без привязки к другим. Это локальные и статические переменные, потоки и т.д.
Смотрим, на какие объекты ссылаются roots. Идём дальше по ссылкам и получаем граф живых объектов.
⚠️Но есть проблема: объекты в памяти постоянно меняются. Есть две крайности:
1️⃣ Когда памяти останется мало, целиком остановить приложение и убрать мусор. Будет большая пауза, но в остальное время сборщик не будет тормозить основное приложение.
2️⃣ Следить за статусом объектов и ссылок, вести таблицы использования. Так ненужные объекты легко найти, но сам сборщик будет занимать много процессорного времени.
Разные коллекторы балансируют между этими крайностями: некоторые фазы происходят параллельно, а для некоторых нужна полная остановка.
Универсального сборщика нет, на выбор влияет количество процессоров, памяти, тип нагрузки и так далее.
В части 2 мы подробно рассмотрим сборщики мусора в java 8
#jvm
Post #178
4.71K
- 👍 3
- ❤ 1