Алгоритмы сборки мусора JVM и сборщики мусора

JVM

Алгоритм сборки мусора JVM и сборщик мусора.

1. Зона сбора мусора

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

Во-вторых, как судить о выживании объекта

Обычно существует два метода (метод подсчета ссылок, анализ достижимости),JVM использует анализ достижимости.

1. Подсчет ссылок

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

  • Достоинства: быстро, удобно, просто в реализации.
  • Дефект: Когда объекты ссылаются друг на друга (A.instance=B и B.instance=A), трудно судить, следует ли перерабатывать объект.

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

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

Объекты в качестве корней GC включают следующее:

  • Ссылочный объект в таблице локальных переменных в текущем стеке виртуальной машины
  • Объект, на который ссылается статическое свойство класса в области метода
  • Объект, на который ссылается константа в области метода

3. finalize

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

Три, различные ссылки (Reference)

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

1. Сильные цитаты

Общий Object obj = new Object() является строгой ссылкой.

(Если есть сильная ссылка на GCroots) сборщик мусора никогда не вернет его.Когда памяти недостаточно, он скорее выдаст ошибку OOM, чтобы заставить программу аварийно остановиться, и не будет восстанавливать объект с сильной ссылкой.

2. Мягкие ссылки

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

Образец кода:

public static void main(String[] args) {
    String str = new String("SunnyBear"); // 强引用
    SoftReference<String> strSoft = new SoftReference<String>(str);
    str = null; // 干掉强引用,确保只有strSoft的软引用
    System.out.println(strSoft.get()); // SunnyBear
    System.gc(); // 执行一次gc,此命令请勿在线上使用,仅作示例操作
    System.out.println("------------ gc after");
    System.out.println(str); // null
    System.out.println(strSoft.get()); // SunnyBear
}

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

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

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

Образец кода:

public static void main(String[] args) {
    String str = new String("SunnyBear"); // 强引用
    WeakReference<String> strWeak = new WeakReference<String>(str);
    str = null; // 干掉强引用,确保只有strSoft的软引用
    System.out.println(strWeak.get()); // SunnyBear
    System.gc(); // 执行一次gc,此命令请勿在线上使用,仅作示例操作
    System.out.println("------------ gc after"); // null
    System.out.println(str); // null
    System.out.println(strWeak.get()); // null
}

Практические приложения, такие как WeakHashMap, ThreadLocal.

4. Фантомная ссылка

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

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

4. ГК

1. Minor GC

  • Особенности: Встречается в новом поколении, встречается чаще и выполняется быстрее.
  • Условие срабатывания: Eden Zone Недостаточно места/Гарантия выделения места.

2. Full GC

  • Особенности: В основном встречается в старом поколении (новое поколение тоже будет переработано), встречается реже, а скорость выполнения медленнее.
  • Условия срабатывания:
    • Вызовите System.gc() .
    • Недостаточно места в зоне престарелых.
    • Гарантия выделения места не удалась.
    • JDK 1.7 и более раннее постоянное поколение (область методов) не хватает места.

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

1. Алгоритм копирования (Copying)

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

复制算法

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

Примечание:

Специальные исследования показывают, что 90% объектов в новом поколении «умирают скоро», поэтому, вообще говоря, достаточно 10% места, занимаемого рециклингом, поэтому нет необходимости делить пространство памяти по соотношению 1 :1, но Разделите память на большую область Эдема и две меньшие области Выживших, и каждый раз используйте Эдем и одну из ячеек Выживших [1]. При переработке скопируйте уцелевшие объекты в Эдеме и Выжившем в другое пространство Выжившего за один раз и, наконец, очистите Эдем и только что использованное пространство Выжившего. Соотношение размеров Eden и Survivor по умолчанию в виртуальной машине HotSpot составляет 8:1, то есть доступное пространство памяти в каждом новом поколении составляет 90% (80%+10%) всей емкости нового поколения и только 10% память будет "утрачена"".

2. Отметить-развернуть

Сначала отметьте все объекты, которые необходимо переработать, а затем равномерно переработайте отмеченные объекты.

标记清除算法

  • преимущество
    • Коэффициент использования составляет 100%.
  • недостаток
    • Маркировка и очистка неэффективны (по сравнению с алгоритмами репликации).
    • Будет сгенерировано большое количество прерывистых фрагментов памяти.

3. Марк-компактный

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

标记整理算法

  • преимущество
    • Коэффициент использования составляет 100%.
    • Отсутствие фрагментации памяти.
  • недостаток
    • Эффективность маркировки и очистки невелика (сравните алгоритм репликации и алгоритм очистки).

6. Сборщик мусора

Сборщик мусора jvm использует все три вышеперечисленных алгоритма и сборку по поколениям.

1. Новое поколение: алгоритм репликации.

коллекционер Объекты коллекции и алгоритмы тип коллектора
Serial Кайнозой, алгоритм репликации один поток
ParNew Кайнозой, алгоритм репликации Параллельный многопоточный сборщик
Parallel Scavenge Кайнозой, алгоритм репликации Параллельный многопоточный сборщик

2. Старость: алгоритм снятия меток и алгоритм сортировки меток

коллекционер Объекты коллекции и алгоритмы тип коллектора
Serial Old Старость, Алгоритм сопоставления меток один поток
Parallel Old Старость, Алгоритм сопоставления меток Параллельный многопоточный сборщик
CMS (развертка Conc Mark) Старость, алгоритм отметок Параллельные и параллельные коллекторы
G1 (сначала мусор) Алгоритм копирования + алгоритм сортировки меток для молодого поколения и старого поколения Параллельные и параллельные коллекторы

Примечание:

  • Parallel: одновременная многопоточная сборка мусора.
  • Параллелизм: многопоточность сборки мусора и многопоточность пользовательских приложений выполняются одновременно.
  • использоватьjps -vВы можете увидеть используемый сборщик мусора, например:-XX:+UseConcMarkSweepGC(система управления контентом)

1. Сборщики мусора, которые можно использовать вместе

Подключено значит даКайнозойистаростьНапарник-сборщик мусора.

垃圾回收器

2. Serial/Serial Old

Самый старый, однопоточный, эксклюзивный, зрелый, подходит для однопроцессорных серверов.-XX:+UseSerialGCИ молодое, и старое поколения пользуются серийными коллекционерами.

3. ParNew

ParNew в основном такой же, как и Serial, с той лишь разницей, что он многопоточный, многопроцессорный и время паузы меньше, чем у Serial.

-XX:+UseParNewGC Использовать ParNew для молодого поколения и Serial Old для старого поколения.

Можно использовать с CMS.

4. Parallel Scavenge (ParallerGC)/Parallel Old

Сборщик мусора, ориентированный на пропускную способность. Высокая пропускная способность позволяет эффективно использовать процессорное время и выполнять вычислительные задачи программы как можно быстрее. Он в основном подходит для задач, выполняющих операции в фоновом режиме без особого взаимодействия. Так называемая пропускная способность — это отношение времени, которое ЦП использует для выполнения пользовательского кода, к общему времени потребления ЦП, то есть пропускная способность = время выполнения пользовательского кода / (время выполнения пользовательского кода + время сборки мусора), виртуальный машина работает в общей сложности 100 минут, из них сбор мусора занимает 1 минуту, а пропускная способность составляет 99%.

5. CMS (параллельная проверка меток)

Сборщик — это сборщик, целью которого является получение кратчайшего времени паузы сбора. В настоящее время большая часть Java-приложений сосредоточена на серверной части интернет-сайтов или систем B/S.Такие приложения уделяют особое внимание скорости отклика служб и надеются, что время паузы системы будет кратчайшим, чтобы пользователи могли лучше опыт.

Сборщик CMS хорошо подходит для этого типа приложений.-XX:+UseConcMarkSweepGC,Как правило, новое поколение использует ParNew, а старое поколение использует CMS., как видно из названия (в том числе "Mark Sweep"), сборщик CMS основан на алгоритме "mark-sweep", и процесс его работы сложнее, чем у предыдущих сборщиков.

процесс переработки

CMS回收过程

Весь процесс делится на 4 этапа, в том числе:

1,начальная отметка: Просто отметьте объекты, с которыми GC Roots может напрямую ассоциироваться, это очень быстро и требует паузы (STW -Stop the world).

2,одновременная маркировка: Анализ достижимости объектов в куче начинается с GC Root, и обнаруживаются уцелевшие объекты, это занимает больше всего времени во всем процессе рециркуляции и не требует паузы.

3.перемаркировать: Приостановка (STW) требуется для исправления записи маркировки части объекта, маркировка которой изменяется, поскольку пользовательская программа продолжает работать во время одновременной маркировки. Время паузы на этом этапе обычно немного больше, чем на начальной фазе маркировки, но намного короче, чем время одновременной маркировки.

  1. Параллельная очистка: пауза не требуется.

Преимущества и недостатки

1. Преимущества

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

2. Недостатки

  • Чувствительность к ресурсам ЦП: поскольку многопоточность занимает ресурсы ЦП на параллельной фазе, если ресурсов ЦП недостаточно, эффективность будет значительно снижена.
  • Из-за CMSПараллельная фаза очисткиПользовательский поток все еще работает, и по мере работы программы естественно будет генерироваться новый мусор, эта часть мусора появляется уже после процесса разметки, и CMS не может с ними справиться в текущей коллекции, поэтому ее приходится убирать в следующий ГК. . Эта часть мусора называетсяплавающий мусор.
  • Из-за существования плавающего мусора часть памяти необходимо резервировать, а это означает, что коллекция CMS не может ждать, пока заполнится старое поколение, прежде чем перерабатывать, как другие сборщики. В версии 1.6 порог использования старого пространства (92%), если зарезервированной памяти недостаточно для хранения плавающего мусора, произойдет сбой параллельного режима, и виртуальная машина временно включит Serial Old для замены CMS.
  • Будет генерировать фрагментацию памяти:алгоритм маркировки-разверткиЭто вызовет прерывистую фрагментацию памяти.

6. G1

Улучшение G1 по сравнению с CMS

  • На основе алгоритма сортировки по отметке не будет фрагментации пространства, а полный сборщик мусора не будет запускаться заранее из-за невозможности получения непрерывного пространства при выделении больших объектов.
  • Контролируемое время паузы: G1 может контролировать время сборки мусора, устанавливая ожидаемое время паузы (время паузы), ноЭто ожидаемое время паузы G1 может быть достигнуто только в максимально возможной степени, не гарантируется.

Предсказуемые паузы:

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

Настройка параметров G1

  • -XX:+UseG1GC // Включить G1
  • -XX:MaxGCPauseMillis=200 // Ожидаемое время паузы 200 миллисекунд, по умолчанию также 200
  • -XX:G1HeapRegionSize=2 // Установите размер каждой области в 2M, который должен быть степенью 2, допустимый диапазон от 1Mb до 32Mb
  • -XX:G1NewSizePercent // Минимальное значение нового поколения, значение по умолчанию 5%
  • -XX:G1MaxNewSizePercent // Максимальное значение нового поколения, значение по умолчанию 60%
  • -XX:ParallelGCThreads // Во время STW количество параллельных потоков GC
  • -XX:ConcGCThreads=n // параллельная фаза маркировки, количество потоков для параллельного выполнения

Как G1 выделяет память кучи?

G1 делит кучу на несколько одинаковыхнезависимая область(Область),Молодое поколение и старое поколение больше не разделены физически.

Алгоритм G1 делит кучу на несколько независимых регионов (Regions), которые по-прежнему принадлежат сборщику поколений. Однако некоторые из этих областей содержат новое поколение, и сборщик мусора нового поколения по-прежнему использует метод приостановки всех потоков приложения для копирования уцелевших объектов в старое поколение или оставшееся пространство. Например, одна из независимых областей показана на рисунке:

独立区域

режим ГХ

1. Молодой ГК

Молодой GC в основном выполняет GC в области Эдема, который будет срабатывать, когда пространство Эдема будет исчерпано. В этом случае данные в пространстве Eden перемещаются в пространство Survivor.Если пространства Survivor недостаточно, часть данных в пространстве Eden будет напрямую переведена в пространство старого поколения. Данные из области Survivor перемещаются в новую область Survivor, а некоторые данные также перемещаются в пространство старого поколения. Наконец, данные в пространстве Eden пусты, сборщик мусора перестает работать, а поток приложения продолжает выполняться.

2. Смешанный ГК

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

процесс сбора

G1回收过程

Грубо разделить на 4 шага:

1,начальная отметка: Просто отметьте объекты, с которыми GC Roots может напрямую ассоциироваться, и измените значение TAMS (Nest Top Mark Start), чтобы при одновременном запуске пользовательской программы на следующем этапе объекты можно было создавать в правильном регионе. необходимо приостановить.Тема (STW), но это занимает очень мало времени

2,одновременная маркировка: Анализ достижимости объектов в куче начинается с GC Root, и находятся уцелевшие объекты.Этот этап занимает много времени, но может выполняться параллельно с пользовательской программой

3.окончательная оценка: Чтобы исправить часть записи метки, которая изменяет метку из-за непрерывной работы программы пользователя во время одновременной метки, виртуальная машина записывает изменения объекта в течение этого периода в журналах запомненных наборов потока, а данные журналов запомненного набора должны быть сохранены на заключительном этапе маркировки Включены в запомненный набор. Эта фаза требует остановленного потока (STW), но может выполняться параллельно.

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

Семь, некоторые важные параметры сборщика мусора

параметр описывать
UseSerialGC Значение по умолчанию для виртуальной машины, работающей в клиентском режиме, после включения этого переключателя используйте комбинацию коллектора Serial+Serial Old для высвобождения памяти.
UseParNewGC Когда этот переключатель включен, используйте комбинацию сборщиков ParNew + Serial Old для освобождения памяти.
UseConcMarkSweepGC Когда этот переключатель включен, используйте комбинацию коллекторов ParNew + CMS + Serial Old для высвобождения памяти. Коллектор Serial Old будет использоваться в качестве резервного коллектора в случае сбоя Concurrent Mode Failure коллектора CMS.
UseParallelGC Значение по умолчанию виртуальной машины, работающей в режиме сервера, при включении этого переключателя использовать комбинацию сборщиков Parallel Scavenge + Serial Old (PS MarkSweep) для высвобождения памяти
UseParallelOldGC Когда этот переключатель включен, используйте комбинацию коллекторов Parallel Scavenge + Parallel Old для освобождения памяти.
SurvivorRatio Соотношение вместимости области Эдема к площади Выжившего в новом поколении, по умолчанию 8, значит Эдем : Выживший = 8 : 1
PretenureSizeThreshold Размер объекта напрямую повышается до старости.После установки этого параметра объекты больше этого параметра будут размещаться непосредственно в старости.
MaxTenuringThreshold Возраст объекта, переведенного в старое поколение.После того, как каждый объект сохраняется в Minor GC один раз, возраст увеличивается на 1. При превышении значения этого параметра он входит в старое поколение.
UseAdaptiveSizePolicy Динамически регулировка размера различных областей в кучи Java и возраста, чтобы войти в старое поколение
HandlePromotionFailure Допускает ли это гарантии распределения, то есть оставшегося места старца не хватит, чтобы разобраться со всеми объектами нового поколения районов Эдем и Выживший.
ParallelGCThreads Установите количество потоков для освобождения памяти во время параллельного GC
GCTimeRatio GC Отношение времени к общему времени, значение по умолчанию равно 99, что позволяет использовать 1% времени GC, что действует только при использовании сборщика Parallel Scavenge.
MaxGCPauseMillis Установите максимальное время паузы для GC, которое вступает в силу только при использовании сборщика Parallel Scavenge.
CMSInitiatingOccupancyFraction Установите, сколько пространства старого поколения используется сборщиком CMS для запуска сборки мусора, значение по умолчанию — 68%, оно вступает в силу только при использовании сборщика CMS.
UseCMSCompactAtFullCollection Определяет, должен ли сборщик CMS выполнять дефрагментацию памяти после сборки мусора.Это вступает в силу только при использовании сборщика CMS.
CMSFullGCsBeforeCompaction Настройте сборщик CMS на запуск дефрагментации памяти после нескольких сборок мусора, вступает в силу только при использовании сборщика CMS.

Я все это прочитал здесь, давайНравится, Комментируйте, Следуйте, ИзбранноеБар!

Автор статьи: IT Wang Xiaoer
Первый адрес:ЭТО Я XE.com/posts/ah4932…
Заявление об авторских правах: содержание статьи следуетAttribution-NonCommercial-No Derivatives 4.0 InternationalДля разрешения просим давать ссылку на автора и исходный текст в видном месте на странице статьи для перепечатки.