Технологии Java

Сборка мусора

Сборка мусора

Содержание

Сборка мусора

  • Освобождение памяти
  • Дефрагментация памяти
    • Объекты могут перемещаться
  • Освобождение ресурсов

Мусор

  • Корни
    • Cсылка из стека
    • Глобальные переменные
    • Thread local переменные
  • Достижимые объекты
    • Есть корневая ссылка
    • Есть ссылка из достижимого объекта
  • Недостижимые объекты
    • Мусор

Освобождение памяти

  • Подсчет ссылок
    • Консервативный
      • Проблемы с «циклическими» ссылками
    • Простой, не ресурсоемкий
  • Граф достижимых объектов
    • Требуется построение графа
      • приостановка исполнения
      • граф может быть большим

Построение графа

  • Выделение корней
  • Разметка

Дефрагментация памяти

  • Сжимающий сборщик
    • Перемещает «живые» данные в начало памяти
    • Object handles
      • Дополнительный уровень ссылок
  • Копирующий сборщик
    • Перемещает «живые» данные в другой блок памяти
    • Исправляет ссылки на «ходу»

Гипотеза о поколениях

Поколения

  • Эдем
  • Выжившие поколения (×n)
  • Старое поколение
  • Постоянное поколение

Память с поколениями

  • Выделение памяти
    • В Эдеме
    • Сдвиг указателя
  • Быстрая сборка мусора
    • Эдем → В1
    • Вi → Вi+1
    • Вn → Старые
  • Полная сборка мусора
    • Долго при большой куче
  • Ссылки из старых в новые
    • Карты памяти

Простые сборщики мусора

Содержание

Последовательный

  • SerialGC

Параллельный

  • ParallelGC

Одновременный

  • ConcMarkSweepGC

Garbage-First

  • G1GC

STW: Начало разметки

  • Подготовка к разметке
  • Разметка корней

Разметка

  • Параллельная разметка
  • Подсчёт реальной занятости регионов

STW: Окончание разметки

  • Переразметка корней
    • Дообновление
  • Подготовка к перемещению
    • Какие регионы и куда

Перемещение

  • Параллельное перемещение объектов

STW: Начало обновления

  • Окончание перемещений

Обновление

  • Параллельное обновление ссылок
    • Линейный обход кучи

STW: Окончание обновления

  • Обновление корней

Фазы

  • STW: Начало разметки
  • Разметка
  • STW: Окончание разметки
  • Перемещение
  • STW: Начало обновления
  • Обновление
  • STW: Окончание обновления

Исходное состояние

STW1: Инициализация разметки

  • Переключение цвета (M1 → M0)
    • Обновление корней
  • Новые TLAB

Разметка/обновление

  • Обход достижимых объектов
    • Подсчёт объёма живых данных на странице
    • Обновление указателей

STW2: Окончание разметки

  • Все достижимые объекты размечены

Обработка страниц

  • Сбор непосещённых
  • Выбор перемещаемых
    • Сортировка по заполняемости
    • Выбор доли наименее заполненных

STW3: Переключение

  • Переключение цвета (M0 → R)
  • Сброс старых перемещений

Перемещение (1)

  • Ссылка на перемещаемый объект

Перемещение (2)

  • Объект перемещён

Перемещение (3)

  • Ссылка на перемещённый объект

Перемещение (4)

  • Обновление ссылки

STW1: Инициализация разметки

  • Переключение цвета (R → M1)
    • Обновление корней
  • Новые TLAB

Разметка/обновление

  • Обход достижимых объектов
    • Подсчёт объёма живых данных на странице
    • Обновление указателей

STW2: Окончание разметки

  • Все достижимые объекты размечены

Фазы

  • STW1: Инициализация разметки
  • Разметка/обновление
  • STW2: Окончание разметки
  • Обработка страниц
  • STW3: Переключение на перемещение
  • Перемещение

Как сделать быстро?

  • Помеченные указатели
    • Нужны биты для пометок
    • Младшие не всегда можно использовать
    • Используем старшие
    • Другая область памяти
    • Страницы памяти, отображаемые в несколько мест
  • Доступ
    • Указатель помечен → всё ok
    • Если не требуется переместить, то пометим
    • Если уже перемещён, обновим ссылку и пометим
    • Если не перемещён, то переместим сами

Свойства ZGC

  • Не основан на поколениях
  • Регионы памяти
    • Маленькие, средние, большие объекты
  • В основном параллельный
  • Разметка+перемещение

Специальные ссылки

Содержание

Специальные ссылки

  • Явные ссылки на объекты
    • Могут быть собраны сборщиком мусора
    • Информация о сборе
  • Пакет java.lang.ref

Абстрактная ссылка

Мягкие ссылки

  • Класс SoftReference<T>
    • Собираются, когда кончается память
    • Рекомендуется собирать LRU
  • Применение
    • Кэши

Слабые ссылки

  • Класс WeakReference<T>
    • Собираются, когда нет сильных и мягких ссылок
  • Класс WeakHashMap<K, V>
    • Слабые ссылки на ключи
  • Применение
    • Identity-кэши с автоматическим удалением

Фантомные ссылки

  • Класс PhantomReference<T>
    • Объект невозможно получить
    • Помещаются в очередь после финализации
  • Применение
    • Действия по очистке
    • Cleaner

Очереди ссылок

  • Класс ReferenceQueue<T>
    • poll() — неблокирующее чтение с удалением
    • remove(timeout?) — блокирующее чтение с удалением
  • Использование
    • Указание очереди при создании ссылки

Финализация

  • Метод object.finalize()
    • Deprecated for removal
    • Вызывается сборщиком мусора
      • Время вызова не гарантируется
      • Часто остаётся до следующего GC
    • Может «возродить» объект
      • Вызывается только один раз
    • Использование
      • Проверка ресурсов
      • Освобождение ресурсов

Заключение

Содержание

Ссылки (1)

Ссылки (2)

Ссылки (3)

Вопросы

???