Одним из преимуществ Java является GC (сборка мусора).Хотя он может помочь нам управлять памятью, он будет STW (Stop the World), когда заработает. То есть остановите все рабочие потоки: «Ребята, вы не работаете, я сначала уберу мусор!».
Тогда есть проблема, подумайте об этом, например, когда вы играете в игру, компьютер приходит в STW и останавливается на несколько секунд, чтобы убрать мусор. Вы можете трахаться, ваши товарищи по команде тоже могут трахаться.
Однако некоторые обычно используемые сейчас сборщики мусора имеют STW.Хотя различные сборщики мусора ломали голову над сокращением времени STW, но избежать STW им не удается. Конкретное сравнение различных сборщиков мусора будет написано в отдельной статье в следующий раз.
Сегодня поговорим о том, как сборщик мусора быстро перебирает корневые узлы. В виртуальной машине HotSpot это делается черезАнализ доступностиопределить, нуждается ли объект в переработке. Анализ доступности должен найти «источник», то есть корневой узел.
Перечислив один корневой узел (GC Roots), а затем коснувшись его полностью, а затем те объекты, которые не были затронуты, будут переработаны. Затем этот процесс следования за лозами должен остановить мир, то есть эти рабочие потоки должны остановиться.Если вы думаете об отношении ссылки на объект, если у вас нет STW, как сборщик мусора может щелкнуть объект?Это просто щелкнуть неправильно. , тогда наши пользователи будут беспокоиться. Таким образом, STW неизбежен при перечислении корневого узла, поэтому мы можем сделать STW как можно короче.
Корневой узел в основном находится в глобальных ссылках (константы, статические свойства класса) и контекстах выполнения (таблица локальных переменных в кадре стека).. Тогда, если мы захотим найти их по одному, это будет очень медленно. И снова наш HotSpotТочность ГХ, то есть ему необходимо знать тип данных в определенном месте, и этот тип является точным. Таким образом, он может точно знать, является ли этот тип данных указателем или ссылкой, о которой он заботится!
В HotSpot метод, называемыйСтруктура OopMap для хранения данных какого типа по какому смещению в объекте. Он регистрируется во время процесса загрузки класса. OopMap можно понимать как дополнительную информацию или тег предмета одежды, мы можем узнать, из чего сделана одежда, взглянув на тег. Таким образом, GC может напрямую смотреть на эти «теги», чтобы узнать информацию при сканировании.
существуетOopMap также будет записан в некоторых определенных местах во время JIT-компиляции., который записывает, на какие позиции в стеке и в регистре ссылаются при выполнении инструкции метода. Каждый метод может иметь несколько OopMaps, которые определяются в соответствии с определенной позицией. Эта конкретная позиция будет вызывать этот метод. Существует несколько главы, каждая с OopMap.
Эти конкретные места в основном находятся в:
1. Перед возвратом метода / после вызова инструкции вызова метода
2. Конец петли
3. Где могут быть выброшены исключения
Эти конкретные места также называются Safepoints.
Причина, по которой OopMap необходимо записывать в определенном месте, заключается в том, что если каждая инструкция будет записана, это потребует много места и увеличит стоимость места для GC, поэтому может быть эффективно записать некоторые ключевые моменты. сжать запись.
Поэтому GC не приходит никогда и никуда.GC может начаться только тогда, когда он достигнет безопасной точки.
Обычно OopMap сжимается в памяти и распаковывается только тогда, когда требуется GC, а затем начинает обход для сканирования соответствующего смещения.
Для метода JNI (Java Native Interface), поскольку собственный метод не имеет ничего общего с интерпретатором и JIT-компилятором, OopMap отсутствует. Его ссылка аналогична добавлению промежуточного слоя, то есть хендла, то есть ссылка не указывает прямо на объект в куче, а ссылка указывает на хэндл, а хэндл указывает на объект в куче. куча. Таким образом, GC может просто сканировать дескриптор напрямую, без необходимости сканировать кадр стека.
Пожалуйста, поправьте меня, если есть ошибки! Личный публичный аккаунт: стратегия прокачки да