Интервьюер прочитал мою предыдущую статью и сказал мне: Возвращайся и жди уведомления!

Java
Интервьюер прочитал мою предыдущую статью и сказал мне: Возвращайся и жди уведомления!

Это 37-я оригинальная статья о том, почему технологии

Старые правила, давайте сначала поговорим о жизни, фотография выше была сделана в понедельник.

Выйдя с работы в понедельник вечером, тетя, которая нашла компанию по продаже цветов с трехколесным велосипедом внизу, снова начала продавать цветы. Она была единственной, занимавшейся делами на всем перекрестке, а пешеходов на всей дороге было немного, все шли торопливо, опустив головы, с легкой грустью в цветах.

Итак, я пошла и купила букет белых роз.

Я закончил смотреть «Любовь во время холеры» в прошлое воскресенье и просто использовал фотографию выше в качестве реквизита. Вообще говоря, я не люблю такого рода чувственные истории, и мне не нравится причина, которая выглядит грандиозно: «У меня в жизни было 622 любовника, но я любил только тебя». Хотя она действительно исчерпывает все возможности любви, она недостаточно реальна.

Напротив, я думаю, что «Осажденный город» г-на Цянь Чжуншу: «То, что я сказал, чтобы дать ей три очка, - это не три очка из трех очков проточной воды и семь очков пыли, а три очка только из трех очков яркой луны. в мире." Любовь фарса более реальна.

Глядя на книгу г-на Ян Цзяна «Трое из нас», она сказала в конце книги: «Хорошие вещи в мире не тверды, и разноцветные облака легко рассеиваются, а стекло хрупко». Это любовь, это настоящая жизнь.

Ну вернемся к статье.

Извините, я был неправ.

Две предыдущие статьи:

«Интервьюер: Вы сказали, что знакомы с jvm? Тогда вы говорите об одновременном анализе достижимости»

Интервьюер: Как переработчик G1 узнает, что вы мусор? 》

В нем есть некоторые неясные моменты, и многие читатели спрашивали, поэтомуЯ думаю, мне нужно добавить некоторые пояснения.

Что еще более важно, после экспертного руководства в описании все еще есть неправильные места,мне тоже нужно сделать опечатку.

Если это действительно вопрос интервью, возможно, интервьюер скажет мне:Хорошо, давайте сегодня первыми. Вы возвращаетесь и ждете уведомления.

Если вы не читали две статьи, которые я только что упомянул, я советую вам не читать эту, потому что вам нужно прочитать сразу три статьи. пройти.. .... (Конечно, прочитав, вы что-то обязательно приобретете.)

Если вы читали мои предыдущие две статьи, прошу прочитать и эту, дополнить и исправить свой ответ, и не бояться, когда интервьюер действительно спрашивает о деталях...

Что ж, прежде чем читать эту статью, я предполагаю, что вы прочитали две хорошие, юмористические, информативные статьи, о которых я упоминал ранее.

Параллельный анализ достижимости — исправления

Я опубликовал эту статью до «Интервьюер: Вы сказали, что знакомы с jvm? Тогда вы говорите об анализе достижимости параллелизма». Многие друзья говорили мне, что не могут понять анимацию в этой части статьи:

Я снял эту анимацию:

Прежде всего, следует отметить, что я не могу понять эту анимацию сейчас. (Неправильный рисунок является неправильным рисунком, но и вынужден найти причину).

Следующий,забудь эту анимацию, повторно анализируем волну исходной схемы снапшота (далее SATB, Снапшот в начале).

Во-первых, давайте посмотрим на граф объектов, когда поток GC начинает сканирование после того, как начальная фаза маркировки (т. е. перечисление корневых узлов) только что вступила в фазу параллельной маркировки:

На приведенном выше рисунке, когда определены корни GC, граф объекта был определен. Когда SATB сканирует, он сканирует на основе определенной карты объектов (моментальной версии карты объектов), то естьЭталонное отношение приведенного выше графа снимка не изменится в процессе сканирования, но реальный граф объекта изменится.

Например: Это похоже на фото на детской площадке, вы считаете количество людей на фото.

Поэтому в момент определения карты объектов, после завершения обычного сканирования, карта объектов становится такой:

Что ж, предзнаменование перед вами завершено.

Здесь нам нужно продемонстрировать ситуацию «объект исчезает».

Прежде всего, давайте определим граф объектов, показанный выше.Должен быть момент в параллельной фазе маркировки.Граф объектов выглядит следующим образом:

Мы обсуждаем проблему «исчезновения объекта» на основе этого графа объектов в данный момент.

Помните два условия, при которых «объект исчезает» должны выполняться одновременно? (Эти два условия взяты из «Углубленного понимания виртуальной машины Java (3-е издание)», стр. 89)

Условие 1: Оценщик вставляет одну или несколько новых ссылок из черного объекта в белый объект.

Условие 2: Оценщик удаляет все прямые или косвенные ссылки с серого объекта на белый объект.

Давайте еще раз прочитаем второе условие, и вы обнаружите, что оно говорит ** «белый объект». «Белый объект» относится к белому объекту в первом состоянии. **

Таким образом, у нас есть основания полагать, что:Условие 1 и условие 2 являются последовательными, то есть оценщик должен вставить одну или несколько новых ссылок от черного объекта к белому объекту, а затем оценщик удаляет все прямые или косвенные ссылки от серого объекта к белому объекту. В таком случае возникает ситуация «объект исчезает».

Под руководством эксперта мы также можем использовать метод опровержения следующим образом:

Мы предполагаем, что сначала удаляется ссылка от серого объекта к белому объекту, то есть сначала срабатывает условие 2. Тогда соответствующий моментграф реальных объектовбудет выглядеть так:

(Обратите внимание, что я подчеркиваю здесь реальный граф объектов, а не граф объектов снимка. Еще раз: граф объектов снимка определяется в начале сканирования и не изменяется во время сканирования.)

Тогда белый объект 9 находится в свободном состоянии, и от корневого узла нет связанной цепочки ссылок, говоря словами теории графов, он недостижим от GC Root к объекту 9, что доказывает, что этот объект не может быть используется больше.Следовательно, пользовательский поток не может указать черный объект 5 на свободный белый объект 9, и вы не можете написать такой код.

Если вы не видите приведенную выше картинку с первого взгляда, то, пожалуйста, посмотрите на картинку ниже, вдруг вы это осознаете:

Черный объект 5 не может указывать на белый объект 9, тогда первое правило не выполняется.

Итак, в итоге мы можем получить:Условие 1 и Условие 2 в порядке.

Далее продолжаем делать картинку по первому условию следующим образом:

Первое условие состоит в том, что оценщик вставляет одну или несколько новых ссылок из черного объекта в белый объект.

В приведенном выше сценарии оценщик вставляет новую ссылку между черным объектом 5 и белым объектом 9 во время работы потока GC. (отмечены красными линиями)

在这个时刻,由于灰色对象6指向白色对象9,所以黑色对象5可以指向白色对象9,想一想我们前面的证明,只要有引用链,黑色对象就可以到达白色对象。

В это время выполняется только условие 1, и объект не исчез.

Далее идет график условия 2,Что STAB ломает, так это условие 2:

Второе условиеОценщик удаляет все прямые или косвенные ссылки с серого объекта на белый объект..

В сценарии на рисунке выше именно оценщик удаляет прямую ссылку с серого объекта 6 на белый объект 9.

В это время белый объект 9 является «исчезнувшим объектом», поскольку черный объект 5 больше не будет сканироваться.

Следует отметить, что оценщик можно понимать как пользовательский поток.Поскольку пользовательский поток и поток GC выполняются одновременно в фазе параллельной маркировки, приведенная выше диаграмма должна появиться, и есть предварительное условие:

Пользовательский поток удаляет ссылку между объектом 6 и объектом 9, прежде чем поток GC просканирует объект 6 и сделает объект 6 серым. Потому что только таким образом, когда поток GC обрабатывает объект 6, возникает соответствующая запись барьера записи.

Если поток GC уже просканировал объект 6, то есть когда объект 6 уже черный (в это время объект 9 либо черный, либо серый, и не может быть белым), пользовательский поток удалит ссылку между объектом 6 и объектом 9. , поток GC обрабатывать не нужно, т.к. объект 9 уже небелый, он точно выживет в этом раунде.

Здесь я цитирую описание R:

https://hllvm-group.iteye.com/group/topic/44381?page=2

Поскольку операция удаления активирует барьер предварительной записи, старое значение ссылки записывается каждый раз, когда изменяется связь ссылки.Только таким образом, когда поток GC достигает объекта, изменения всех полей типа ссылки этого объекта все записано. , вы не пропустите ни одного живого объекта в графе моментального снимка. Конечно, очень возможно, что в моментальном снимке есть живой объект, но по мере выполнения параллельного GC он может умереть, но SATB позволит ему пережить этот GC и стать плавающим мусором.

В барьере записи SATB превращает объекты, на которые указывают старые ссылки, в небелые (неважно, если они уже черно-серые, или они становятся серыми, если они белые).

Фактический эффект от этого таков: если поле серого объекта изначально указывает на белый объект, но до того, как параллельный маркер сможет просканировать это поле, этому полю присваивается другое значение (например, null), то это поле не является белым Связь между объектами разорвана. Барьер записи SATB гарантирует, что объект, на который изначально ссылается поле, будет выделен серым цветом до того, как произойдет это отсечение, тем самым предотвращая возникновение вышеуказанного условия 2.

в:"Сделать все объекты, на которые указывают старые ссылки, небелыми. "Смысл в нашем сценарии следующий:

старая цитатаОтносится к: ссылке между серым объектом 6 и белым объектом 9.

объект указывал наОтносится к: белому объекту 9.

стать небелым: относится к белому объекту 9, ставшему серым.

Поэтому после последовательного срабатывания двух условий и завершения сканирования графа объектов он будет выглядеть следующим образом:

После того, как параллельное сканирование закончится, возьмите серый объект 9 в качестве корня (используйте его как корень, он, естественно, станет черным) и снова просканируйте, чтобы окончательный граф объектов стал таким:

Некоторые друзья спросят:Если пользовательский поток не указывает объект 5 на объект 9 в процессе маркировки, а только удаляет ссылку между объектом 6 и объектом 9, как выглядит этот граф объектов?

Это выглядит так, вы должны представить себе:

Объект 9 по-прежнему черный, но он стал плавучим мусором и избежал этой переработки. Не влияет на работу программы.

Далее пусть приведенное выше изображение анимируется, и я замедляю последовательность переключения между изображениями. Вы можете сами попробовать:

Поэтому все вышеприведенные описания - единственный раз, который я считаю правильным, показывающий, как схема SATB решает проблему "исчезновения объекта".

Описание этой части в "Интервьюер: Вы сказали, что знакомы с jvm? Тогда вы говорите о параллельном анализе достижимости" слишком просто и есть ошибки. Я извиняюсь перед всеми и исправляю эту статью.

Когда ты мусор - Errata

В G1 Recycler: как узнать, что вы мусор? Описание в этой статье такое:

«Объект, с которым GC Roots может напрямую ассоциироваться: это часть региона, который был использован, поэтому он находится между низом и верхом».

На самом деле, вы также можете узнать это из описания в конце статьи. Набор объектов, с которыми GC Roots может напрямую ассоциироваться, должен быть «меньше» используемой части региона.После рекурсии графа объектов сумма всех объектов равна используемой части региона.

На этой картинке во второй половине статьи мы также можем интуитивно обнаружить, что часть между низом и верхом уже используется регионом. Но в этой части только объекты между нижним и NextTAMS являются объектами, с которыми GC Roots может напрямую ассоциироваться, и эта часть объектов не является той частью, которую использует регион.

Когда ты чушь-дополнительное объяснение

О G1 Recycler: как узнать, что вы мусор? «В этой статье есть два места, которые нужно дополнить.

Некоторые читатели спросили:Содержание рециклинга в статье не обсуждается, а каждая чистка реально не будет рециклингом, значит ли это, что рециклинг происходит только после многократных циклов маркировки?

один.

Во-первых, в статье действительно нет обсуждения утилизации. Я также писал в предыдущем разделе, что утилизация G1 делится на две части:

1. Глобальная параллельная маркировка: глобальная параллельная маркировка.

2. Пауза эвакуации: на этом этапе происходит копирование некоторых живых объектов в регионе в пустой регион, а затем освобождение исходного пространства региона.

Пока понятна фаза глобальной параллельной маркировки, можно ответить на вопрос, поднятый в тексте:

Поэтому я только иллюстрирую фазу глобальной параллельной маркировки.

Если вы хотите узнать об этапе переработки, вы можете пойти и прочитать ответ R. Я настоятельно рекомендую вам прочитать эту статью, нажать «Нравится», открыть ссылку ниже и прочитать ее несколько раз:

https://hllvm-group.iteye.com/group/topic/44381

Во-вторых, «каждая очистка не будет перерабатываться. Значит ли это, что переработка происходит только после нескольких циклов маркировки?»

Это предложение, возможно, я подчеркнул в статьеФаза очистки не копирует объекты, вкупе с отсутствием описания стадии переработки, читатель немного запутался.

После того, как глобальная одновременная маркировка завершена, за ней следует процесс повторного использования.

Просто причина, по которой сборщик G1 может установить предсказуемую модель времени паузы (указывается -XX:MaxGCPauseMillis, значение по умолчанию — 200 миллисекунд), заключается в том, что он использует Region как наименьшую единицу одной коллекции, то есть память пространство, собираемое каждый раз, равно Это целое число, кратное размеру региона, поэтому можно запланировать сборку мусора всего региона во всей куче Java.

Чтобы быть более конкретным, мусор, накопленный в каждом Регионе, имеет «ценность» (ценность — это опытная ценность количества места, полученного при переработке, и времени, необходимого для переработки). И эти «ценности» сохраняются в списке приоритетов, о котором знает сборщик G1.

Таким образом, на этапе переработки приоритет будет отдаваться регионам с наибольшей стоимостью переработки. Таким образом, процесс переработки не перерабатывает все регионы.

два.

Вот еще один вопрос, заданный читателями:Если он утилизируется каждый раз при маркировке, то почему интервал, в котором находится красный прямоугольник, такой же, как и после последней маркировки, как будто он не сортировался, разве после сортировки не должно быть пробелов в памяти?

Я думаю, разумное объяснение тому, что я сказал выше: ценность этого Региона недостаточна, поэтому он не был переработан в этот раз. Со временем в нем скапливается все больше и больше мусора, а «ценность» становится все выше и выше, и он всегда будет перерабатываться.

Другой читатель спросил:Глядя на процесс параллельной маркировки, у меня возникает вопрос, какова роль prevBitmap? Поскольку это похоже на сканирование с нуля каждый раз, я не вижу его эффекта.

На этот вопрос можно ответить по этой картинке:

Это E — этап Remark.Как видно, на этом этапе PrevBitmap действительно пригодится.

Как упоминалось ранее, этот регион избежал последней сборки мусора из-за недостаточного «значения», поэтому это место, где prevBitmap вступает в игру, когда происходит следующая сборка мусора.Диапазон, соответствующий записанным в него адресам, не нужно размечать заново, потому что объекты, соответствующие этим адресам, уже являются мусором.

Мы можем предположить, что E представляет фазу Remark n-го раунда переработки. Тогда PrevBitmap является отмеченным результатом раунда n-1.

В предыдущей статье говорилось:Предыдущее растровое изображение записывает состояние маркировки объекта после предыдущего раунда параллельной маркировки., так как предыдущий раунд был завершен (предыдущий раунд — это раунд n-1), информацию этого битового массива можно использовать напрямую.

Смысл возможности использования напрямую такой же, как было сказано выше: диапазон, соответствующий записанным в него адресам, не нужно размечать заново, потому что объекты, соответствующие этим адресам, уже являются мусором.

На F-карте видно, что текущая F-карта — это состояние, в котором фаза очистки завершена:

Есть два критерия оценки:

1. По сравнению с изображением E PrevBitmap и NextBitmap поменялись местами.

2. Пространство соответствующего адреса в PrevBitmap отмечено светло-серым цветом.

На данный момент разметка завершена, и PrevBitmap стал результатом n-1-й разметки.

какой ты мусор

Поскольку предыдущая статья была опубликована, мне нужно изменить соответствующий контент. Напомните последующим читателям, что если они увидят статью, им нужно обратить внимание на проблемы, описанные в этих местах.

Но в процессе поиска своих статей я обнаружил некоторые вещи, которые меня очень расстроили.Большинство предыдущих статей были плагиатом.

Хуже всего следующее:

Это учетная запись Baijiahao, слово в слово скопировала мою статью и пометила ее как «оригинальную»?

Я пошел и написал отзыв:

Он не осмелился прокомментировать.

А следом можно перекусить. Я хочу сделать это фото дома, но не могу:

Таких случаев еще много. В конечном счете, это все еще вопрос осведомленности об авторских правах.

Проблема с авторскими правами, я был в«После 77 дней подписки я заработал 487,52 юаня»В этой статье обсуждается:

Мой аккаунт не будет распространять пиратские ресурсы, так было в прошлом, так сейчас и так будет в будущем.

Не делать зла — величайшее благо. Поделиться с тобой.

Поэтому настоящим торжественно заявляю, что если моя статья будет воспроизводиться без разрешения, первоначальный адрес должен быть помечен, а QR-код паблик-аккаунта в конце статьи должен быть сохранен, иначе я обязательно сообщу об одном другому.

Сначала я заявлю на вас за порнографию, чтобы привлечь внимание персонала, а затем заявлю на вас за плагиат, и пусть персонал накажет вас.

Я в ярости.

Последнее слово (пожалуйста, обратите внимание)

Благодаря этому случаю я снова почувствовал это.Читая дикие статьи в Интернете (такие как мои), я должен быть осторожным, скептичным и учиться.

Если вам не хватает таланта и обучения, неизбежно будут ошибки.Если вы обнаружите какие-либо ошибки, пожалуйста, оставьте сообщение и укажите на это мне, и я его исправлю. (У меня есть это предложение в каждой технической статье, и я имею в виду это.)

Спасибо за чтение,Я придерживаюсь оригинала, добро пожаловать и спасибо за внимание.

Я почему технология, хороший сычуаньский человек, который не большой парень, но любит делиться, теплый и информативный.

выше.

Добро пожаловать в публичный аккаунт [почему технология] и настаивайте на выводе оригинальности. Делитесь технологиями, пробуйте жизнь, и я надеюсь, что вы и я вместе добьемся прогресса.