интервьюер:Почему бы в этот раз не поговорить о сборщике мусора G1?
Кандидат: Мммм, хорошо
Кандидат: В прошлый раз, когда я вспомнил, недостатки сборщика мусора CMS: он будет генерировать фрагментацию памяти && нужно резервировать место
Кандидат: При решении этих двух проблем очень вероятно, что время паузы будет слишком длинным, говоря прямо, время паузы CMS "непредсказуемо".
Кандидат: а G1 можно понимать как "апгрейд" на сборщике мусора CMS
Кандидат: Сборщик мусора G1 может установить время, на которое вы хотите, чтобы Stop The Word приостановился, и сборщик мусора G1 попытается удовлетворить вас в соответствии с этим временем.
Кандидат: Когда я ранее представил кучу JVM, я нарисовал картинку. Распределение памяти в куче изолировано «физическим» пространством.
Кандидат: В мире сборщика мусора G1 разделение кучи уже не в "физической" форме, а в "логической" форме
Кандидат: Тем не менее, концепция «поколений», как упоминалось ранее, все еще работает в мире сборщиков мусора G1.
Кандидат: Например, новые объекты вообще будут выделены в зону Эдема, а если объекты нового поколения Minor GC прошли по умолчанию 15 раз, если они еще выживут, то будут переданы старому поколению и т.д. ..
Кандидат: Позвольте мне нарисовать "кучное" пространственное распределение мира сборщика мусора G1.
Кандидат: Из рисунка видно, что куча разделена на несколько равных областей, и каждая область в G1 называется регионом.
Кандидат: Мне не нужно больше говорить о старости, новом поколении и Выжившем, верно? Правила такие же, как у CMS
Кандидат: В G1 также есть область Humongous (большие объекты), которая фактически используется для хранения очень больших объектов (более половины памяти региона).
Кандидат: Как только обнаруживается, что нет ссылки на большой объект, его можно переработать прямо в Minor GC молодого поколения.
интервьюер:В порядке…
Кандидат: На самом деле, если немного подумать, то можно понять, почему «пространство кучи» должно быть «подразделено» на множество небольших областей.
Кандидат: Как и предыдущие сборщики мусора, куча "физически" разделена
Кандидат: Если объем кучи (памяти) велик, каждый раз при выполнении «сборки мусора» необходимо очищать большую область, а время сбора нелегко контролировать.
Кандидат: После разделения на несколько небольших участков легко контролировать «время сбора» этих «небольших участков» для переработки.
интервьюер:В порядке…
интервьюер:Тогда я, наверное, понимаю. Тогда почему бы вам не рассказать о процессе GC?
Кандидат: Ну, в сборщике G1 его в основном можно разделить на Minor GC (Young GC) и Mixed GC, а в некоторых особых случаях может встречаться Full GC
Кандидат: Тогда я просто скажу сначала Minor GC?
интервьюер: Ну что, начнем
Кандидат: Minor GC G1 фактически запускает то же время, что и сборщик мусора, упомянутый ранее.
Кандидат: Minor GC будет запущен, когда область Эдема будет заполнена. Minor GC также бывает Stop The World
Кандидат: Следует добавить, что: в мире G1 пространство кучи, занимаемое новым поколением и старым поколением, не так фиксировано (будет динамически корректироваться в соответствии с "максимальным временем паузы")
Кандидат: Приятно знать, что эта штука предоставит нам параметры для настройки.
Кандидат: Таким образом, динамическое изменение количества молодых регионов может «контролировать» накладные расходы Minor GC.
интервьюер:А как насчет Minor GC и процесса его переработки? Можете ли вы добавить немного больше деталей?
Кандидат: Minor GC, я думаю, можно просто разделить на три шага: корневое сканирование, обновление && процесс RSet, копирование объекта
Кандидат: Первый шаг должен быть хорошо понят, потому что он похож на предыдущую CMS и может быть понят как процесс начальной разметки
Кандидат: Второй шаг включает понятие «Rset».
интервьюер:В порядке…
Кандидат: Из прошлого раза, когда мы говорили о процессе рециркуляции CMS, мы также говорили о Minor GC, который использует «таблицу тележки», чтобы избежать полного сканирования таблицы объектов в старости.
Кандидат: Поскольку Minor GC повторно использует объекты в молодом поколении, но если в старом поколении есть объекты, которые ссылаются на молодое поколение, эти объекты, на которые ссылается старое поколение, не могут быть повторно использованы.
Кандидат: Та же проблема существует и в G1 (все-таки минорный GC). CMS - это карточная таблица, а хранилище G1 для решения проблемы "ссылки между поколениями" вообще называется RSet
Кандидат: просто помните, что RSet хранится в каждом регионе, и в нем записано, что «другие регионы относятся к объектным отношениям текущего региона».
Кандидат: Для региона молодого поколения его RSet сохраняет только референсы из старого поколения (т.к. нет необходимости хранить молодое поколение, нужно самому делать Minor GC)
Кандидат: Для Региона старого поколения его RSet сохранит только ссылку на него в старом поколении (в сборщике мусора G1, перед тем, как будет переработано старое поколение, сначала будет переработано молодое поколение, поэтому нет необходимости спасите молодое поколение.цитата)
интервьюер:В порядке…
Кандидат: После прочтения концепции RSet во втором шаге должно быть легко понять, верно?
Кандидат: Это не что иное, как обработка информации RSet и сканирование, а также добавление соответствующих ссылок объектов старого поколения на объекты молодого поколения в корни GC, чтобы избежать повторного использования.
Кандидат: Третий шаг вполне понятен: храните уцелевшие объекты после сканирования в "пустой области Выжившего" или "Старости", а остальные области Эдема зачищайте.
Кандидат: Здесь следует упомянуть, что в G1 есть еще один термин, называемый CSet.
Кандидат: его полное имя — набор сбора, который сохраняет регион, который «будет выполнять сборку мусора» в сборщике мусора. Все выжившие объекты в CSet будут перенесены в другие доступные регионы.
Кандидат: В конце Minor GC будут обработаны мягкие ссылки, слабые ссылки, JNI Weak и другие ссылки, и коллекция завершится.
интервьюер: ну я понял, это не сложно
интервьюер:Я помню, вы упоминали смешанный GC ранее, почему бы вам не поговорить об этом процессе?
Кандидат: Без проблем.
Кандидат: смешанный сборщик мусора будет запущен, когда уровень занятости пространства кучи достигнет определенного порога (по умолчанию 45%, определяется параметрами).
Кандидат: смешанный GC опирается на данные региона после статистики «Global Concurrent Mark».
Кандидат: «Глобальная параллельная маркировка» — ее процесс очень похож на CMS, этапы, вероятно, следующие: начальная маркировка (STW), параллельная маркировка, окончательная маркировка (STW) и очистка (STW).
интервьюер: Это действительно похоже.Можете ли вы продолжить разговор о конкретном процессе?
Кандидат: Ну, еще хочу пояснить: Смешанный GC точно будет перерабатывать молодое поколение, а некоторые регионы старого поколения будет собирать на переработку, так что это "смешанное" GC.
Кандидат: Первый - "Начальная маркировка". Этот процесс "разделяет" Остановить Мир Minor GC (Minor GC должен происходить в Mixed GC) и повторно использует операцию "Scan GC Roots".
Кандидат: В ходе этого процесса и старое поколение, и новое поколение будут сметать
Кандидат: В целом процесс "начальной разметки" относительно быстрый, ведь ретроспективного обхода нет
интервьюер:…
Кандидат: Далее идет "маркировка параллелизма", этот этап не будет Stop The World
Кандидат: Поток GC выполняется вместе с потоком пользователя, и поток GC отвечает за сбор информации об уцелевших объектах каждого региона.
Кандидат: Проследите путь от GC Roots, чтобы найти объекты, которые сохранились во всей куче, что требует много времени.
интервьюер:В порядке…
Кандидат: Следующим шагом является этап «перемаркировки», который аналогичен CMS, помечая те объекты, которые изменились на этапе «одновременной маркировки».
Кандидат: Это не просто?
интервьюер: подождите минуту
интервьюер:CMS должна повторно сканировать все стеки потоков и все молодое поколение от имени пользователя root на этапе «замечания».
интервьюер:Насколько я знаю, G1 вроде бы не такой, понимаете?
Кандидат: Ну, G1 действительно не такой.Для решения проблемы референсных изменений, вызванных фазой "конкурентной маркировки" в G1, используется алгоритм SATB.
Кандидат: Можно просто понять так: при запуске GC он делает "снимок" для уцелевших объектов
Кандидат: На «этапе параллелизма» записывайте старое опорное значение каждый раз, когда изменяется эталонное отношение.
Кандидат: Затем на этапе «перемаркировки» сканируются только «измененные» ссылки блока, чтобы увидеть, есть ли еще какие-либо объекты и добавлены в «GC Roots».
Кандидат: Однако есть небольшая проблема с алгоритмом SATB, а именно: если G1 считает, что он жив в начале, он не будет переработан в этом GC, даже если объект мог стать в "конкурентной фазе". .
Кандидат: Поэтому у G1 тоже может быть проблема "плавающего мусора"
Кандидат: Но в целом для G1 это не большая проблема (ведь речь не о том, чтобы избавиться от всего хлама сразу, а о времени Stop The World)
интервьюер:В порядке…
Кандидат: Последний этап — «очистка», этот этап также остановит мир, в основном для подсчета и сброса статуса метки.
Кандидат: В соответствии с «моделью прогнозирования паузы» (фактически установленное время паузы) она будет определять, сколько Регионов перерабатывает этот сборщик мусора.
Кандидат: Вообще говоря, Mixed GC выберет все регионы молодого поколения и некоторые регионы старого поколения с «высокой ценностью переработки» (высокая ценность переработки на самом деле является большим количеством мусора) для сбора.
Кандидат: В конце концов, очистка Mixed GC выполняется путем «копирования».
Кандидат: Следовательно, коллекция может не обязательно собирать весь мусор, G1 выберет количество Регионов по времени паузы (:
интервьюер: Ну я примерно понимаю процесс
интервьюер:Когда произойдет полная сборка мусора в G1?
Кандидат: если смешанный сборщик мусора не может идти в ногу со скоростью пользовательских потоков, выделяющих память, что приводит к заполнению старого возраста и неспособности продолжать смешанный сборщик мусора, он будет понижен до последовательного старого сборщика мусора для сбора всей кучи сборщика мусора.
Кандидат: Однако эта сцена очень редкая по сравнению с CMS.Ведь у G1 нет проблемы фрагментации памяти CMS(:
Резюме этой статьи (Особенности сборщика мусора G1):
- От исходного «физического» поколения до текущего «логического» поколения «логическая» куча памяти делится на несколько регионов.
- Используйте CSet для хранения коллекций перерабатываемых регионов.
- Используйте RSet для работы со ссылками между поколениями (Примечание: RSet не сохраняет эталонные отношения, относящиеся к молодому поколению)
- G1 можно просто разделить на: Minor GC, Mixed GC и Full GC.
- [Срабатывает, когда область Eden заполнена] Незначительный процесс восстановления GC можно просто разделить на: (STW) сканирование корней GC, обновление && процесс Rset, копирование и очистка
- [Инициируется, когда все пространство кучи составляет определенную долю] Смешанная сборка мусора полагается на «глобальную одновременную метку» для получения CSet (перерабатываемой области), а затем выполняет «очистку копии».
- Когда R велико, чтобы описать принцип G1, с точки зрения макроэкономики G1 на самом деле "глобальный флаг параллелизма"и"скопировать живой объект"
- Используйте алгоритм SATB для решения проблемы, связанной с тем, что ссылки на объекты могут быть изменены на этапе «одновременной маркировки».
- Укажите параметры времени паузы для установки пользователями (G1 попытается уложиться во время паузы, чтобы скорректировать количество областей, восстановленных во время GC.)
Добро пожаловать в мой публичный аккаунт WeChat【Java3y] Давайте поговорим о Java-интервью, серия онлайн-интервьюеров постоянно обновляется!
Серия [Онлайн-интервьюер-Мобильный терминал]Продолжаем обновлять два раза в неделю!
【Онлайн-интервьюер-компьютер】СерияПродолжаем обновлять два раза в неделю!
Оригинал это не просто! ! Проси три! !