Технологии Java
Сборка мусора
https://kgeorgiy.info/courses/java-advanced/
Copyright © Georgiy Korneev
Сборка мусора
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
Мусор
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
Сборка мусора
Освобождение памяти
Дефрагментация памяти
Объекты могут перемещаться
Освобождение ресурсов
Мусор
Корни
Cсылка из стека
Глобальные переменные
Thread local переменные
Достижимые объекты
Есть корневая ссылка
Есть ссылка из достижимого объекта
Недостижимые объекты
Мусор
Освобождение памяти
Подсчет ссылок
Консервативный
Проблемы с «циклическими» ссылками
Простой, не ресурсоемкий
Граф достижимых объектов
Требуется построение графа
приостановка исполнения
граф может быть большим
Построение графа
Выделение корней
Разметка
Дефрагментация памяти
Сжимающий сборщик
Перемещает «живые» данные в начало памяти
Object handles
Дополнительный уровень ссылок
Копирующий сборщик
Перемещает «живые» данные в другой блок памяти
Исправляет ссылки на «ходу»
Поколения
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
Гипотеза о поколениях
Поколения
Эдем
Выжившие поколения (×n)
Старое поколение
Постоянное поколение
Память с поколениями
Выделение памяти
В Эдеме
Сдвиг указателя
Быстрая сборка мусора
Эдем → В
1
В
i
→ В
i+1
В
n
→ Старые
Полная сборка мусора
Долго при большой куче
Ссылки из старых в новые
Карты памяти
Простые сборщики мусора
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
Последовательный
SerialGC
Параллельный
ParallelGC
Одновременный
ConcMarkSweepGC
Garbage-First
G1GC
Shenandoah
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
STW: Начало разметки
Подготовка к разметке
Разметка корней
Разметка
Параллельная разметка
Подсчёт реальной занятости регионов
STW: Окончание разметки
Переразметка корней
Дообновление
Подготовка к перемещению
Какие регионы и куда
Перемещение
Параллельное перемещение объектов
STW: Начало обновления
Окончание перемещений
Обновление
Параллельное обновление ссылок
Линейный обход кучи
STW: Окончание обновления
Обновление корней
Фазы
STW: Начало разметки
Разметка
STW: Окончание разметки
Перемещение
STW: Начало обновления
Обновление
STW: Окончание обновления
ZGC
Содержание
Сборка мусора
Мусор
Поколения
Простые сборщики мусора
Shenandoah
ZGC
Специальные ссылки
Заключение
Исходное состояние
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
Абстрактная ссылка
Класс
Reference<T>
get()
— получить объект или
null
clear()
— присвоить
null
enqueue()
— поместить в очередь
isEnqueued()
— находится ли в очереди
Мягкие ссылки
Класс
SoftReference<T>
Собираются, когда кончается память
Рекомендуется собирать LRU
Применение
Кэши
Слабые ссылки
Класс
WeakReference<T>
Собираются, когда нет сильных и мягких ссылок
Класс
WeakHashMap<K, V>
Слабые ссылки на ключи
Применение
Identity-кэши с автоматическим удалением
Фантомные ссылки
Класс
PhantomReference<T>
Объект невозможно получить
Помещаются в очередь после финализации
Применение
Действия по очистке
Cleaner
Очереди ссылок
Класс
ReferenceQueue<T>
poll()
— неблокирующее чтение с удалением
remove(timeout?)
— блокирующее чтение с удалением
Использование
Указание очереди при создании ссылки
Финализация
Метод
object.finalize()
Deprecated for removal
Вызывается сборщиком мусора
Время вызова не гарантируется
Часто остаётся до следующего GC
Может «возродить» объект
Вызывается только один раз
Использование
Проверка ресурсов
Освобождение ресурсов
Заключение
Содержание
Сборка мусора
Специальные ссылки
Заключение
Ссылки (1)
Garbage Collection
http://www.artima.com/insidejvm/ed2/gcP.html
Weak, Soft, and Phantom References in Java
https://dzone.com/articles/weak-soft-and-phantom-references-in-java-and-why-they-matter
HotSpot VM Garbage Collection Tuning Guide
https://docs.oracle.com/en/java/javase/20/gctuning/
Package java.lang.ref
https://docs.oracle.com/en/java/javase/20/
docs/api/java.base/java/lang/ref/package-summary.html
Ссылки (2)
Shenandoah GC
https://wiki.openjdk.org/display/shenandoah/Main
Deep Dive into ZGC
https://dl.acm.org/doi/10.1145/3538532
Ссылки (3)
Алексей Шипилёв
https://shipilev.net/
Java Objects Inside Out
https://shipilev.net/jvm/objects-inside-out/
Do It Yourself (OpenJDK) Garbage Collector
https://shipilev.net/jvm/diy-gc/
Java Memory Model Pragmatics
https://shipilev.net/blog/2014/jmm-pragmatics/
Вопросы
???