Так просто выполнить сборку мусора JVM

Java JVM алгоритм CMS

Прежде чем читать эту статью, я хотел бы порекомендовать всем мероприятие Alibaba Cloud Double 11. Это действительно, очень, очень рекомендуется. Что касается преимуществ для новичков, на этот раз Alibaba Cloud действительно инвестировала в преимущества. Alibaba Cloud не должна пропустить это. Если вы думаете, что это просто реклама, можете сразу перейти к основному тексту.

Последнее событие Alibaba Cloud Double 11 (только для новых пользователей Alibaba Cloud для покупки, старые пользователи могут получить красные конверты с кэшбэком для новых пользователей, и есть шанс разделить миллионы красных конвертов поровну в будущем), скидка составляет очень, очень, очень большой.Кроме того, присоединяйтесь к группе, и в будущем их будет больше.Возможность разделить красные конверты 100w поровну!На данный момент в моей команде 12 новичков, и сейчас скидка 50%, то есть скидка 10%! ! ! .Сконцентрируйся:1 основной облачный сервер 2G всего за 99,5 юаней на 1 год! ! ! 1 основной облачный сервер 2G всего за 298,50 юаней на 3 года! ! ! Всего 8,2 юаня в месяцСкидка только для новичков! Это адрес моей команды:Aliyun.com/act/team111…!

Обзор выше:«Наверное, самая понятная статья об области памяти Java»

написать впереди

Общие вопросы интервью в этом разделе:

Ответы на вопросы указаны в тексте

  • Как определить, мертв ли ​​объект (два метода).
  • Кратко опишите сильные ссылки, мягкие ссылки, слабые ссылки и виртуальные ссылки (разница между виртуальными ссылками, мягкими ссылками и слабыми ссылками, а также преимущества использования мягких ссылок).
  • Как определить, является ли константа устаревшей константой
  • Как понять, что урок бесполезен
  • Каковы алгоритмы сборки мусора и их характеристики?
  • Почему HotSpot делится на новое поколение и старое поколение?
  • Каковы общие сборщики мусора?
  • Внедрить CMS, сборщик G1.
  • В чем разница между Minor Gc и Full GC?

Предохранитель этой статьи

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

Java-программисты должны видеть документацию

Ха-ха кожу это! Я открываю исходный код руководства по изучению Java. Книга, охватывающая основные знания, которые необходимо освоить большинству Java-программистов, постепенно совершенствуется шаг за шагом, и мы с нетерпением ждем вашего участия. Адрес на гитхабе:GitHub.com/snail Climb/…. Взгляните, я не думаю, что вы пожалеете об этом, если можете, поставьте звезду, чтобы поощрить это!

1 Демистификация распределения и повторного использования памяти JVM

Автоматическое управление памятью в Java в основном направлено на восстановление объектной памяти и выделение объектной памяти. В то же время основной функцией автоматического управления памятью Java являетсякучаВыделяйте и освобождайте объекты в памяти.

Схематическая диаграмма кучи памяти до JDK1.8:

Как видно из рисунка выше, память кучи делится на новое поколение, старое поколение и постоянное поколение. Новое поколение делится на: область Эдема + область Выжившего1 + область Выжившего2. Стоит отметить, что вся постоянная генерация была удалена в JDK 1.8 и заменена областью, называемой метапространством (постоянная генерация использует пространство кучи памяти JVM, тогда как метапространство использует физическую память, на которую напрямую влияет ограничение физической памяти машины).

1.1 Предметы преимущественно размещаются в райской зоне

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

В большинстве случаев объекты выделяются в райской зоне молодого поколения. Когда в области eden недостаточно места для выделения, виртуальная машина инициирует второстепенный сборщик мусора. Давайте проведем фактический тест ниже.

Перед тестированием давайте посмотримВ чем разница между Minor Gc и Full GC?

  • ГК нового поколения (минор ГК): Относится к действию по сборке мусора нового поколения. Незначительные сборщики мусора происходят очень часто, а скорость восстановления обычно выше.
  • GC старого поколения (Major GC/Full GC): Относится к GC, возникающему в пожилом возрасте.Большой GC часто сопровождается по крайней мере одним второстепенным GC (не абсолютным), а скорость Главного GC обычно более чем в 10 раз ниже, чем у Малого GC.

контрольная работа:

public class GCTest {

	public static void main(String[] args) {
		byte[] allocation1, allocation2;
		allocation1 = new byte[30900*1024];
		//allocation2 = new byte[900*1024];
	}
}

Выполняется:

Добавлены параметры:-XX:+PrintGCDetails

результат операции:

Из приведенного выше рисунка видно, что память в области eden выделена практически полностью (даже если программа ничего не делает, новое поколение будет использовать более 2000 КБ памяти). Что произойдет, если мы снова выделим память для размещения2?

allocation2 = new byte[900*1024];

Кратко объясните, почему это происходит:Потому что при выделении памяти в selection2 память в области eden уже почти выделена.Мы только что сказали, что когда в области Eden недостаточно места для выделения, виртуальная машина инициирует Minor GC.Во время GC виртуальная машина находит, чтоlocation1 не может быть сохранено в пространстве Survivor. , поэтому нужно пройтиМеханизм гарантии распределенияЗаранее перенесите объекты нового поколения в старое поколение, места в старом поколении достаточно для хранения аллокации1, поэтому Full GC не будет. После выполнения Minor GC, если объекты, выделенные позже, могут существовать в области eden, память по-прежнему будет выделена в области eden. Вы можете выполнить следующую проверку кода:

public class GCTest {

	public static void main(String[] args) {
		byte[] allocation1, allocation2,allocation3,allocation4,allocation5;
		allocation1 = new byte[32000*1024];
		allocation2 = new byte[1000*1024];
		allocation3 = new byte[1000*1024];
		allocation4 = new byte[1000*1024];
		allocation5 = new byte[1000*1024];
	}
}

1.2 Крупные объекты входят в старость напрямую

Большие объекты — это объекты, требующие большого объема непрерывной памяти (например, строки, массивы).

Почему должно быть так?

Во избежание снижения эффективности из-за копирования, вызванного механизмом гарантии выделения памяти при выделении памяти для больших объектов.

1.3 Долгоживущие объекты войдут в старость

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

Если объект все еще жив после рождения Эдема и после первого Малого GC и может быть размещен Выжившим, он будет перемещен в ячейку Выжившего, а возраст объекта будет установлен на 1. Каждый раз, когда объект переживает MinorGC в Survivor, возраст увеличивается на 1 год, и когда его возраст увеличивается до определенного уровня (по умолчанию 15 лет), он будет переведен в старое поколение. Порог возраста для перевода объекта в старое поколение, который можно передать через параметр-XX:MaxTenuringThresholdустанавливать.

1.4 Определение возраста динамических объектов

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

2 Тема умерла?

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

2.1 Метод подсчета ссылок

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

Этот метод прост в реализации и эффективен, но текущая основная виртуальная машина не выбирает этот алгоритм для управления памятью, основная причина в том, что сложно решить проблему взаимных циклических ссылок между объектами.Так называемая проблема взаимной ссылки между объектами показана в следующем коде: За исключением того, что объекты objA и objB ссылаются друг на друга, между этими двумя объектами нет никакой ссылки. Однако, поскольку они ссылаются друг на друга, их счетчики ссылок не равны 0, поэтому алгоритм подсчета ссылок не может уведомить сборщик мусора о необходимости их повторного использования.

public class ReferenceCountingGc {
    Object instance = null;
	public static void main(String[] args) {
		ReferenceCountingGc objA = new ReferenceCountingGc();
		ReferenceCountingGc objB = new ReferenceCountingGc();
		objA.instance = objB;
		objB.instance = objA;
		objA = null;
		objB = null;

	}
}

2.2 Алгоритм анализа достижимости

Основная идея этого алгоритма состоит в том, чтобы пройти серию"Корни ГК"Объект GC Roots используется в качестве отправной точки, и поиск начинается с этих узлов.Путь, который проходит узел, называется эталонной цепочкой.Когда объект не имеет какой-либо эталонной цепочки, связанной с GC Roots, это доказывает, что объект недоступен.

可达性分析算法

2.3 Еще раз о цитатах

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

До JDK1.2 определение ссылки в Java было очень традиционным: если значение хранилища данных ссылочного типа представляет собой начальный адрес другого участка памяти, говорят, что этот участок памяти представляет собой ссылку.

После JDK1.2 Java расширила понятие ссылки и разделила ссылку на четыре типа: сильная ссылка, мягкая ссылка, слабая ссылка и виртуальная ссылка (сила ссылки постепенно ослабевает).

1. сильная цитата

Большинство цитат, которые мы использовали ранее, на самом деле были сильными цитатами, которые используются чаще всего. Если объект имеет сильную ссылку, то что-то вродепредметы первой необходимости, сборщик мусора никогда не будет его перерабатывать. Когда места в памяти недостаточно, виртуальная машина Java скорее выдаст ошибку OutOfMemoryError, вызывающую аварийное завершение программы, чем по желанию восстанавливает объекты с сильными ссылками для решения проблемы нехватки памяти.

2. Мягкая ссылка

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

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

3. Слабая ссылка (WeakReference)

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

Слабые ссылки можно использовать в сочетании с очередью ссылок (ReferenceQueue).Если объект, на который ссылается слабая ссылка, является сборщиком мусора, виртуальная машина Java добавит слабую ссылку в соответствующую очередь ссылок.

4. PhantomReference

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

Виртуальные ссылки в основном используются для отслеживания активности объектов, собирающих мусор..

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

Обратите особое внимание на то, что слабые ссылки и виртуальные ссылки редко используются в программировании, а мягкие ссылки используются чаще, потому чтоМягкие ссылки могут ускорить восстановление памяти JVM из мусора, поддерживать операционную безопасность системы и предотвращать такие проблемы, как переполнение памяти (OutOfMemory)..

2.4 Недостижимые объекты не "должны умереть"

Даже недостижимые в методе анализа достижимости объекты не являются «обязательными к смерти». В настоящее время они временно находятся в «стадии испытания». Чтобы действительно объявить объект мертвым, требуется как минимум два процесса маркировки; в методе анализа пола помечается и фильтруется впервые, а условием фильтрации является необходимость выполнения метода finalize для этого объекта. Если объект не переопределяет метод finalize или метод finalize был вызван виртуальной машиной, виртуальная машина считает эти два случая излишними.

Объекты, которые определены для выполнения, будут помещены в очередь на повторную отметку, если только объект не связан с каким-либо объектом в цепочке ссылок, иначе он будет действительно переработан.

2.5 Как определить, что константа является устаревшей константой

Пул констант времени выполнения в основном повторно использует отброшенные константы. Итак, как мы можем судить, что константа является устаревшей константой?

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

Примечание: мыВероятно, самая понятная статья об области памяти Java.Также упоминается, что JVM JDK1.7 и более поздних версий переместили пул констант времени выполнения из области методов и открыли область в куче Java (Heap) для хранения пула констант времени выполнения.

2.6 Как судить о классе бесполезно

Область методов в основном перерабатывает бесполезные классы, так как же судить о том, что класс бесполезен?

Определить, является ли константа «устаревшей константой», относительно просто, но гораздо сложнее определить, является ли класс «бесполезным классом». Класс должен соответствовать следующим трем условиям одновременно, чтобы его можно было считать«Бесполезный класс»:

  • Все экземпляры этого класса были утилизированы, то есть в куче Java нет экземпляров этого класса.
  • ClassLoader, загружавший класс, был переработан.
  • На объект java.lang.Class, соответствующий этому классу, нигде нет ссылок, и доступ к методам этого класса посредством отражения нигде невозможен.

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

3 алгоритма сборки мусора

垃圾收集算法

3.1 Алгоритм маркировки-развертки

Алгоритм разделен на этапы «маркировки» и «очистки»: сначала маркируются все объекты, которые необходимо переработать, а после завершения маркировки все отмеченные объекты равномерно перерабатываются. Это самый простой алгоритм сбора, и он очень эффективен, но он принесет две очевидные проблемы:

  1. Вопросы эффективности
  2. Проблемы с пространством (много несмежных фрагментов после пометки «Очистить»)

标记-清除算法

3.2 Алгоритм репликации

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

复制算法

3.3 Алгоритмы маркировки-сопоставления

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

标记-整理算法

3.4 Алгоритм сбора поколений

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

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

Расширенные вопросы интервью:Почему HotSpot делится на новое поколение и старое поколение?

Ответ основан на введении в алгоритм сбора поколений выше.

4 Сборщик мусора

Если алгоритм сбора — это методология утилизации памяти, то сборщик мусора — это конкретная реализация утилизации памяти.

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

4.1 Последовательный коллектор

Последовательный сборщик Сборщик — самый простой и самый старый сборщик мусора. Как видно из названия, этот сборщик является однопоточным. это«Одна нить»Значение не только означает, что он будет использовать только один поток сборки мусора для завершения работы по сборке мусора, но, что более важно, он должен приостанавливать все остальные рабочие потоки, когда выполняется работа по сборке мусора ("Stop The World") до конца его сбора.

В новом поколении используется алгоритм репликации, а в старом поколении используется алгоритм маркировки-сопоставления.

Serial收集器

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

Но лучше ли сборщик Serial других сборщиков мусора? Конечно есть, этоПростой и эффективный (по сравнению с однопоточными другими сборщиками). Поскольку у сборщика Serial нет накладных расходов на взаимодействие потоков, он естественным образом может обеспечить высокую эффективность однопоточного сбора. Последовательный сборщик — хороший выбор для виртуальных машин, работающих в клиентском режиме.

4.2 Коллектор ParNew

Сборщик ParNew на самом деле является многопоточной версией сборщика Serial.За исключением использования многопоточности для сборки мусора, остальное поведение (параметры управления, алгоритмы сбора, стратегии утилизации и т. д.) точно такое же, как у Serial. коллекционер.

В новом поколении используется алгоритм репликации, а в старом поколении используется алгоритм маркировки-сопоставления.

ParNew收集器

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

Дополнение к концепциям параллельности и параллелизма:

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

  • Параллельно: Относится к одновременному выполнению пользовательского потока и потока сборки мусора (но не обязательно параллельно, может выполняться попеременно), пользовательская программа продолжает работать, а сборщик мусора работает на другом процессоре.

4.3 Параллельный сборщик мусора

Сборщик Parallel Scavenge аналогичен сборщику ParNew.Так что же в нем такого особенного?

-XX:+UseParallelGC 

    使用Parallel收集器+ 老年代串行

-XX:+UseParallelOldGC

    使用Parallel收集器+ 老年代并行

Сборщик Parallel Scavenge ориентирован на пропускную способность (эффективное использование ЦП). Сборщики мусора, такие как CMS, больше заботятся о времени паузы пользовательских потоков (улучшении взаимодействия с пользователем). Так называемая пропускная способность — это отношение времени, затраченного на выполнение пользовательского кода в ЦП, к общему времени потребления ЦП.Сборщик Parallel Scavenge предоставляет пользователям множество параметров для выбора наиболее подходящего времени паузы или максимальной пропускной способности.Если вы мало знаете о работе сборщика, если существует ручная оптимизация, вы можете оставить оптимизацию управления памятью для виртуальная машина.Это также хорошая идея.

В новом поколении используется алгоритм репликации, а в старом поколении используется алгоритм маркировки-сопоставления.

ParNew收集器

4.4 Серийный старый коллекционер

Версия серийного коллектора старого поколения, который также является однопоточным сборщиком. У него две основные цели: одна используется вместе с сборщиком Parallel Scavenge в JDK1.5 и более ранних версиях, а другая — в качестве запасного варианта для сборщика CMS.

4.5 Параллельный старый коллектор

Старая версия сборщика Parallel Scavenge.. Используйте многопоточность и алгоритм «отметить и отсортировать». Там, где важны пропускная способность и ресурсы ЦП, сборщику Parallel Scavenge и сборщику Parallel Old можно отдать приоритет.

4.6 Сборщик CMS

Сборщик CMS (Concurrent Mark Sweep) — это сборщик, целью которого является получение кратчайшего времени паузы сбора. Он очень подходит для использования в приложениях, ориентированных на взаимодействие с пользователем.

Сборщик CMS (Concurrent Mark Sweep) — это первый настоящий параллельный сборщик для виртуальной машины HotSpot, и впервые поток сборки мусора и пользовательский поток работают (в основном) одновременно.

от имениMark SweepПо этим двум словам видно, что сборщик CMS является своего родаАлгоритм маркировки-разверткиПо сравнению с предыдущими сборщиками мусора процесс его работы более сложен. Весь процесс делится на четыре этапа:

  • Начальная разметка:Приостановить все другие потоки и записать объекты, напрямую связанные с корнем, что очень быстро;
  • Параллельная маркировка:Одновременно открывайте GC и пользовательские потоки и используйте структуру замыкания для записи доступных объектов. Но в конце этой фазы структура замыкания не обязательно будет содержать все достижимые в данный момент объекты. Поскольку пользовательский поток может постоянно обновлять поле ссылки, поток GC не может гарантировать производительность анализа достижимости в реальном времени. Таким образом, этот алгоритм будет отслеживать, где происходят эти эталонные обновления.
  • Переименовать:Целью фазы перемаркировки является исправление записей маркировки той части объектов, маркировка которых изменена, поскольку программа пользователя продолжает работать во время параллельной маркировки.Время паузы на этой фазе обычно немного больше, чем при начальной маркировке. фаза, которая намного длиннее, чем фаза одновременной маркировки.
  • Параллельная очистка:Запускается пользовательский поток, и поток GC начинает очищать отмеченную область.

CMS垃圾收集器

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

  • Чувствителен к ресурсам ЦП;
  • Не справляется с плавающим мусором;
  • Алгоритм повторного использования, который он использует — алгоритм «пометки и очистки» приводит к большой фрагментации пространства в конце коллекции.

4.7 Коллектор G1

G1 (Garbage-First) — серверно-ориентированный сборщик мусора, в основном для машин с несколькими процессорами и большим объемом памяти, с высокой вероятностью удовлетворяющий требованиям времени паузы сборщика мусора, но обладающий также высокими характеристиками производительности.

Это считается важной эволюционной функцией виртуальной машины HotSpot в JDK1.7. Он имеет следующие характеристики:

  • Параллелизм и параллелизм: G1 может в полной мере использовать аппаратные преимущества ЦП и многоядерной среды, а также использовать несколько ЦП (ЦП или ядро ​​ЦП), чтобы сократить время паузы Stop-The-World. Некоторым другим сборщикам изначально необходимо приостановить действие GC, выполняемое потоком Java, но сборщик G1 все же может позволить программе Java продолжать выполнение параллельным образом.
  • Коллекция поколений: хотя G1 может самостоятельно управлять всей кучей GC без сотрудничества с другими сборщиками, он все же сохраняет концепцию генерации.
  • пространственная интеграция: В отличие от алгоритма "отметить-очистить" CMS, G1 является сборщиком, основанным на алгоритме "отметить-очистить" в целом, с локальной точки зрения он основан на алгоритме "копирования".
  • предсказуемая пауза: это еще одно большое преимущество G1 по сравнению с CMS. Сокращение времени паузы является общей задачей G1 и CMS, но в дополнение к достижению низкой паузы, G1 также может установить предсказуемую модель времени паузы, позволяя пользователям четко указывать временной интервал. длиной M миллисекунд.

Работа коллектора G1 условно делится на следующие этапы:

  • начальная отметка
  • одновременная маркировка
  • окончательная оценка
  • Проверка на переработку

Сборщик G1 поддерживает список приоритетов в фоновом режиме.Каждый раз, в соответствии с разрешенным временем сбора, предпочтительно выбирается регион с наибольшим значением восстановления (отсюда и его название Garbage-First).. Такое использование Region для разделения пространства памяти и перезапуска приоритетной области гарантирует, что сборщик GF сможет собрать максимально возможную эффективность за ограниченное время (память будет разделена на ноль).

Ссылаться на:

  • Глубокое понимание виртуальной машины Java: расширенные функции JVM и рекомендации (второе издание)
  • no.OSCHINA.net/hose E/blog/…

Если ты расцветешь, ветерок придет. Добро пожаловать в мою общедоступную учетную запись WeChat: «Руководство по прохождению интервью на Java», теплую общедоступную учетную запись WeChat. Ответьте на ключевое слово "1" в фоновом режиме официального аккаунта, возможно, вы увидите то, что хотите!