Механизм и сборщик мусора JVM

1 Как определить, что объект - мусор?

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

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

      Логика метода подсчета ссылок такова: при сохранении объектов в куче счетчик поддерживается в заголовке объекта, а если объект добавляет ссылку на него, добавляется счетчик ++. Если ссылочная связь не работает, тогда counter–. Если счетчик объекта становится равным 0, это означает, что объект был отброшен и не жив.

      Недостатки: легко возникают «острова», то есть, если AB содержит ссылки друг на друга, они никогда не могут быть переработаны.

Welfare Welfare Welfare Бесплатно получить карту навыков Java framework Обратите внимание, что это бесплатно 

 

Бесплатное получение необходимого + V для получения

1.2 Анализ доступности

      Через объект GC Root начните смотреть вниз, чтобы увидеть, доступен ли объект.

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

     Как показано на рисунке ниже, используя корневой каталог GC в качестве узла, ищите вниз.Когда объект не подключен цепочкой ссылок на корневой каталог GC, он будет помечен как объект, пригодный для повторного использования. Хотя Object5, 6 и 7 содержат ссылки друг на друга, они недоступны для корня GC, поэтому они будут считаться объектами, пригодными для повторного использования.

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

     После того, как было определено, что объект является мусором, следующее, что нужно рассмотреть, - это переработка, так как же его переработать?

2.1 Mark-Sweep

  • отметка

      Найдите в памяти объекты, которые необходимо переработать, и отметьте их

  • Очистить

      Уберите объекты, помеченные для переработки, и освободите соответствующее пространство памяти

** Недостатки: **

  1. Процессы маркировки и очистки требуют времени и неэффективны.
  2. Будет сгенерировано большое количество несмежных фрагментов памяти. Слишком большая фрагментация пространства может привести к необходимости выделять большие объекты в процессе выполнения программы, неспособности найти достаточно непрерывной памяти и заранее запустить другую сборку мусора.

2.2 Копирование

      Разделите память на две равные области и используйте только одну из них за раз, как показано на следующем рисунке:

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

** Недостатки: ** Низкое использование пространства

2.3 Mark-Compact

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

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

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

  • Область Юнга: алгоритм репликации (после выделения объекта жизненный цикл может быть относительно коротким, а эффективность репликации области Юнга относительно высока)
  • Старая область: очистка или маркировка отметок (объекты старой области имеют более длительный срок службы, копирование не требуется, лучше отметить и очистить)

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

     Если алгоритм сборки - это методология сборки мусора, то сборщик мусора - это его посадка

3.1 Серийный коллектор

Кайнозойский коллекционер, единственный выбор для кайнозойской коллекции ранних версий JDK

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

Достоинства: простой и эффективный, с высокой производительностью однопоточных мобильных телефонов

Недостатки: нужно приостановить другие потоки

Алгоритм: алгоритм копирования

Диапазон использования: новое поколение

Приложение: коллектор нового поколения по умолчанию в клиентском режиме.

3.2 Сборщик ParNew

Новое поколение сборщиков можно понимать как многопоточную версию последовательного сборщика.

Преимущества: при наличии нескольких процессоров он более эффективен, чем последовательный.

Недостатки: процесс сбора приостанавливает все потоки приложений, что менее эффективно, чем последовательный, при использовании одного процессора.

Алгоритм: алгоритм копирования

Сфера применения: новое поколение

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

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

      Сборщик Parallel Scavenge - это сборщик нового поколения. Он также является сборщиком, использующим алгоритм репликации. Он также является параллельным многопоточным сборщиком. Он выглядит так же, как ParNew, но Parallel Scanvenge уделяет больше внимания пропускной способности системы.

      Пропускная способность = время выполнения кода пользователя / (время выполнения кода пользователя + время сборки мусора)

      Например, виртуальная машина работает в общей сложности 100 минут, время сборки мусора занимает 1 минуту, а пропускная способность = (100-1) / 100 = 99%. Если пропускная способность выше, это означает, что время сборки мусора короче, а пользовательский код может полностью использовать ресурсы ЦП и выполнять вычислительные задачи программы в кратчайшие сроки.

-XX:MaxGCPauseMillis控制最大的垃圾收集停顿时间,
-XX:GC Time Ratio直接设置吞吐量的大小
复制代码

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

       Сборщик Serial Old - это старая версия сборщика Serial, а также однопоточный сборщик. Разница в том, что он использует «алгоритм пометки и сортировки», а процесс работы такой же, как и у сборщика Serial.

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

      Сборщик Parallel Old - это старая версия сборщика Parallel Scavenge, которая использует многопоточность и «алгоритм маркировки и сортировки» для сборки мусора. Пропускная способность - приоритет.

3.6 Сборщик CMS

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

       Используется «алгоритм снятия отметок», и весь процесс делится на 4 этапа.

  1. Начальная отметка Начальная отметка CMS Отметьте объекты, которые GC Roots могут быть связаны с Stop The World ---> быстро
  2. Одновременно отметьте параллельную отметку CMS для отслеживания корней GC
  3. Замечание Замечание CMS Измените содержание одновременной разметки в связи с изменениями в пользовательской программе Stop TheWorld
  4. Параллельная проверка CMS

      Из-за одновременной маркировки и одновременного удаления во всем процессе поток сборщика может работать с пользовательским потоком, поэтому в целом процесс восстановления памяти сборщика CMS выполняется одновременно с пользовательским потоком.

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

Недостатки: использование алгоритма mark-sweep будет генерировать много пространственных фрагментов, а параллельная фаза снизит пропускную способность.

Коллектор 3,7 G1

      Параллельность и параллелизм

      Коллекция поколений (все еще сохраняет концепцию поколений)

      Пространственная интеграция (в целом относится к алгоритму «маркировка-организация» и не вызовет фрагментации пространства)

      Предсказуемые паузы (более продвинутый, чем CMS, заключается в том, что пользователи могут четко указать временной сегмент длиной M миллисекунд, а время, затрачиваемое на сборку мусора, не должно превышать N миллисекунд)

      При использовании сборщика G1 структура памяти кучи Java сильно отличается от других сборщиков. Он разделяет всю кучу Java на несколько независимых областей равного размера (Region), хотя новое и старое поколение все еще сохраняются. Концепция, но новое поколение и старое поколение больше не разделены физически, все они представляют собой совокупность регионов (не обязательно непрерывных).

Рабочий процесс (аналогичный CMS):

  1. Начальная маркировка Отметьте объекты, которые могут быть связаны с GC Roots, и измените значение TAMS, вам нужно приостановить пользовательский поток.
  2. Параллельная маркировка Выполните анализ достижимости из корней сборщика мусора, найдите уцелевшие объекты и выполните их одновременно с пользовательскими потоками
  3. Final Marking (Final Marking) Измените фазу одновременной маркировки из-за одновременного выполнения пользовательской программы для изменения данных, пользовательский поток должен быть приостановлен
  4. Скрининг и переработка (подсчет данных в реальном времени и эвакуация) Отсортируйте стоимость и стоимость переработки для каждого региона и сформулируйте план переработки в соответствии со временем паузы ГХ, ожидаемым пользователем

3.8 Классификация

  • Серийный коллектор-> Серийный и серийный старый

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

  • Параллельный сборщик [приоритет пропускной способности] -> Параллельное сканирование, параллельное старое

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

  • Параллельный сборщик [приоритет времени паузы] -> CMS, G1

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

3.9 Как выбрать подходящий сборщик мусора

Официальный сайт

[https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html#sthref28]] (https://docs.oracle.com/javase/8/docs/technotes/ guides / vm / gctuning / collectors.html # sthref28)

  • Установите приоритет настройки размера кучи и позвольте серверу выбирать самому
  • Если объем памяти меньше 100 МБ, используйте серийный коллектор.
  • Если это одноядерное устройство и время паузы не требуется, используйте последовательный порт или JVM, чтобы выбрать
  • Если время паузы больше 1 секунды, выберите параллельный или JVM
  • Если время отклика является наиболее важным и не может превышать 1 секунду, используйте параллельный сборщик

** Способ открытия: **

(1) Последовательный

-XX : + UseSerialGC

-XX : + UseSerialOldGC

(2) Параллельный (приоритет пропускной способности):

-XX : + UseParallelGC

-XX : + UseParallelOldGC

(3) Параллельный сборщик (приоритет времени ответа)

-XX : + UseConcMarkSweepGC

-XX : + Использовать G1GC

 

рекомендация

отblog.csdn.net/yuandengta/article/details/109188592