Отсканируйте QR-код ниже или WeChat, чтобы найти официальную учетную запись.
菜鸟飞呀飞
, вы можете следить за публичной учетной записью WeChat, читать дальшеSpring源码分析
,Java并发编程
,Netty源码系列
а такжеMySQL工作原理
статья.
предисловие
Алгоритм этапа маркировки был представлен в предыдущей статье, а в этой статье будет представлен алгоритм этапа очистки. Существует около трех распространенных алгоритмов: алгоритмы пометки-развертки, копирования, пометки-сжатия, ниже мы представим эти три алгоритма один за другим.
Алгоритм маркировки-развертки
Алгоритм оформления тегов - самый ранний и самый основной алгоритм сбора мусора, который разделен на два этапа: фаза тегов и четкой фазы. Роль фазы маркировки состоит в том, чтобы отметить, какой объект является объектом выживаемости, как определить, выживает ли объект, в предыдущей статьеАлгоритм разметки для сборки мусорабыл введен в. Фаза очистки заключается в обходе каждого объекта с начала памяти кучи и восстановлении памяти, в которой расположены неподдающиеся восстановлению объекты.
❝Примечание: Освобождение памяти здесь означает не прямое опустошение, а ведение списка свободной памяти, память, в которой находится мертвый объект, добавляется в список свободных, а данные в памяти не очищаются. Когда новый объект претендует на место в памяти в следующий раз, найдите область памяти из этого свободного списка, а затем запишите данные нового объекта в эту память.Если объекты мусора ранее хранились в этой памяти, то данные объекта мусора теперь перезаписываются.
❞
Это также является причиной того, что данные могут быть восстановлены после удаления данных с диска или форматирования диска под компьютером Windows. Обязательным условием является то, что после удаления или форматирования данных диска новые данные не были перезаписаны, иначе они не будут восстановлены.
Алгоритм маркировки-развертки может быть представлен следующей схематической диаграммой.
Алгоритм маркировки-развертки в принципе не имеет преимуществ, единственным преимуществом может быть то, что идея реализации относительно проста, и это алгоритм, о котором люди могут легко думать.
Но у него много недостатков, в первую очередь, он не эффективен. На этапе маркировки все объекты необходимо пройти через все корневые узлы (GC Roots), чтобы определить, является ли объект живым или нет, а затем на этапе очистки необходимо пройти все пространство кучи от начала до конца, что эквивалентно двукратному обходу пространства кучи, поэтому эффективность невысока.
Во-вторых, алгоритм пометки-очистки будет генерировать фрагментацию памяти.После сбора объектов мусора во всем пространстве кучи остается много небольших доступных областей памяти.Эти небольшие области не являются непрерывными, поэтому они называются фрагментацией памяти. При выделении памяти для большого объекта может случиться так, что хотя памяти кучи достаточно, но нет полной свободной памяти для хранения объекта, в это время снова будет запущена операция GC, что очень недружественно для приложения. .из.
алгоритм репликации
Для решения проблемы фрагментации памяти, вызванной алгоритмом маркировки-развертки, появился алгоритм копирования.
Идея реализации алгоритма копирования такова: разделить область памяти на две части, каждый раз использовать только одну часть области, а другая часть пустая, при сборке мусора уцелевшие объекты копируются в пустую , В некоторых областях исходная область памяти полностью очищается за один раз. Алгоритм репликации можно представить следующей схемой.
Преимуществом алгоритма копирования является высокая эффективность.Он объединяет два процесса маркировки и очистки в один.Если в процессе маркировки будет обнаружено, что объект является уцелевшим, он будет непосредственно копировать объект в свободную область, поэтому его эффективность будет высокой для алгоритмов маркировки-развертки. Кроме того, алгоритм репликации не будет генерировать фрагментацию памяти после сборки мусора.
Конечно, очевиден и недостаток алгоритма копирования, то есть половина объема памяти тратится впустую. Кроме того, поскольку объект копируется в новую область памяти, то есть адрес объекта изменился, поэтому после копирования необходимо изменить ссылочный адрес объекта.В этом процессе пользовательский поток также должен быть приостановлено, поэтому STW (Stop The World).
Если большинство объектов в целевой области сборки мусора являются уцелевшими объектами или даже в крайнем случае все объекты являются уцелевшими объектами, то алгоритм репликации должен копировать все объекты, что однозначно неэффективно. Таким образом, алгоритм копирования подходит для использования в областях, где большинство объектов являются объектами мусора при каждой сборке мусора. Например, в области нового поколения большинство объектов являются объектами «процветания», и большинство из них подлежат переработке каждый раз, когда область нового поколения очищается от мусора.
На самом деле все сборщики мусора для области нового поколения, такие как Serial, ParNew и Parallel Scavenge, используют алгоритм репликации для сборки мусора.
❝В виртуальной машине HotSpot новое поколение подразделяется на зону Eden, зону Survivor0, зону Survivor1 (далее S0 и S1)."Eden:S0:S1=8:1:1", в процессе использования всегда будет свободная область в областях S0 и S1, что составляет 10% нового поколения, а для алгоритма копирования требуется половина свободной области, так почему алгоритм сборки мусора для новое поколение все еще использует алгоритм копирования? Это связано с тем, что большая часть нового поколения — это мусорные объекты (обычно 98%), а уцелевших объектов в каждой коллекции очень мало, поэтому область Survivor может полностью хранить эти уцелевшие объекты. Если есть Выживший, который не может спасти уцелевшие объекты, не волнуйтесь, еще есть место для гарантий. Что касается гарантированного пространства, я подробно расскажу об этом позже в статье о совместном использовании структуры памяти JVM.
❞
Алгоритм Марк-Компакт
Упомянутый выше алгоритм пометки-зачистки приведет к фрагментации памяти, а алгоритм копирования будет тратить половину области памяти, и он не подходит для восстановления области, где большинство объектов являются уцелевшими объектами.Для устранения недостатков этих двух алгоритмов , Появился алгоритм маркировки-сжатия.
Идея реализации алгоритма сжатия тегов состоит в том, чтобы сначала судить, является ли каждый объект уцелевшим объектом в соответствии с алгоритмом тегирования, затем сжать все уцелевшие объекты в один конец памяти и, наконец, очистить все области памяти за пределами области памяти. граница. Схематическая диаграмма выглядит следующим образом.
Алгоритм маркировки-сжатия аналогичен алгоритму маркировки-развертки, но отличие состоит в том, что алгоритм маркировки-сжатия имеет еще один шаг — фрагментацию памяти. После того, как алгоритм пометочного сжатия соберет мусор, ему не нужно поддерживать отдельный список свободных мест для определения доступной памяти, а нужно только поддерживать начальный указатель свободного адреса, что намного дешевле, чем поддержка списка свободных мест. Когда вам нужно выделить адрес памяти для нового объекта, вам нужно всего лишь переместить указатель.
Преимущество пометочного сжатия состоит в том, что оно не приводит к фрагментации памяти, а также устраняет недостаток потери половины области памяти в алгоритме копирования. Однако недостаток алгоритма маркировки-сжатия также очевиден: у него на один шаг сортировки памяти больше, чем у алгоритма маркировки-развертки, поэтому он менее эффективен. При этом алгоритм маркировки-сжатия также задействует процесс перемещения объектов в процессе сортировки памяти, поэтому в этот период пользовательский поток будет приостановлен, а адрес ссылки переменной будет изменен, что также вызовет явление STW.
В сравнении
Наконец, используйте таблицу для сравнения алгоритмов пометки-очистки, копирования, пометки-сжатия с трех точек зрения.
отметка-ясно | копировать | разметка-сжатие | |
---|---|---|---|
эффективность | Средняя | самый быстрый | самый медленный |
накладные расходы памяти | маленький (но создает фрагментацию памяти) | Пустая трата половины памяти (без фрагментации памяти) | маленький (без фрагментации памяти) |
движущийся объект | ненужный | нужно | нужно |
Эти три алгоритма сборки мусора имеют свои преимущества и недостатки, и ни один из них не идеален. Обычно в процессе фактического использования они используются вместе. Когда позже в статье будут представлены 7 конкретных классических сборщиков мусора, будут приведены конкретные примеры.
Алгоритм сбора поколений
Алгоритм поколенческой сборки отличается от трех вышеописанных алгоритмов. На самом деле это не алгоритм. Он основан на том, что разные объекты имеют разный жизненный цикл. Для повышения эффективности сборки мусора можно использовать разные методы сборки мусора. принято для объектов с разным жизненным циклом. Обычно в Java объекты делятся на новое поколение и старое поколение, и для их переработки во время сборки мусора используются разные алгоритмы переработки.
Большая часть восстановления мусора в настоящее время в Java представляет собой независимый алгоритм восстановления.
Алгоритм инкрементного сбора
В алгоритме сборки мусора, описанном выше, на этапе сборки мусора пользовательские потоки будут находиться в состоянии STW.Если время паузы слишком велико, это будет очень недружественно для приложения, что серьезно повлияет на работу пользователя и систему. стабильность. Отсюда и алгоритм пошагового сбора.
Основная идея алгоритма инкрементной сборки такова: если время паузы, вызванное одноразовой сборкой мусора, слишком велико, то поток сборки мусора и пользовательский поток выполняются попеременно. Поток сборки мусора выполняется в течение определенного периода времени, собирает только небольшую область, затем переключается на пользовательский поток и так далее, пока сборка мусора не завершится. На одноядерном ЦП это явление попеременного выполнения называется параллелизмом.
В общем, нижний слой алгоритма инкрементного сбора по-прежнему представляет собой базовый алгоритм, введенный ранее: алгоритм маркировки-развертки или алгоритм копирования. Алгоритмы добавочной сборки позволяют выполнять фазу маркировки мусора и очистку или копирование отдельно, правильно обрабатывая конфликты между потоками сборки мусора и пользовательскими потоками.
Хотя алгоритм инкрементного сбора может сократить время паузы системы, из-за частого переключения контекстов между потоками на ЦП оказывается дополнительная нагрузка, что в конечном итоге приведет к снижению пропускной способности системы.
Алгоритм разбиения
В целом, при тех же условиях, чем больше место в куче, тем больше времени требуется для сборки мусора и тем больше время STW, вызванное каждым сборщиком мусора. Чтобы лучше контролировать время паузы, генерируемое сборщиком мусора, большая область памяти может быть разделена на множество небольших областей памяти.При выполнении сборки мусора одновременно восстанавливаются только несколько небольших областей в соответствии с ожидаемым временем паузы.Вместо все пространство кучи, тем самым сокращая время паузы, создаваемое сборщиком мусора.
Идея алгоритма поколенческого сбора состоит в том, чтобы разделить пространство кучи на две разные области в соответствии с разными жизненными циклами объектов, в то время как идея алгоритма разбиения состоит в том, чтобы разделить все пространство кучи на несколько последовательных небольших областей. . Каждая небольшая область используется независимо и перерабатывается независимо.Преимущество этого алгоритма заключается в том, что он может контролировать переработку нескольких небольших областей одновременно.
Текущим представителем сборщика мусора, использующего алгоритм разделения, является сборщик G1.
Суммировать
В этой статье в основном представлены три основных алгоритма: алгоритм пометки-развертки, алгоритм копирования, алгоритм пометки-сжатия, а затем представлены три других алгоритма: алгоритм поколенческого сбора, алгоритм пошагового сбора, алгоритм разбиения, строго говоря, эти три алгоритма. алгоритмы, я лично думаю, что это три вида идей, и они по-прежнему используют три основных алгоритма, представленных ранее.
В реальном сборщике мусора большинство из них работают на основе этих трех идей и алгоритмов.
Ссылаться на
- Третье издание Чжоу Чжимина "Углубленное понимание виртуальной машины JavaJVM"