Алгоритм сборки мусора
Классификация алгоритмов сборки мусора
Теория коллекции поколений
Теперь распространенные на рынке сборщики мусора используют теорию сборки по поколениям.
Так называемая коллекция поколений предназначена для разделения памяти на новое поколение и старое поколение в соответствии с жизненным циклом объекта. Подробности можно посмотретьМодель памяти JAVA
существуетКайнозойПредметы "живут и умирают", большое количество предметов (99%) умирает каждый раз, когда вы их собираете, так что вы можете выбиратьалгоритм пометки-копии, каждая сборка мусора может быть выполнена с небольшими затратами на копирование объекта.
а такжестаростьВероятность выживания объекта относительно высока, а уцелевших объектов много.Если вы выберете алгоритм репликации, вам придется заплатить более высокую стоимость ввода-вывода, и для репликации нельзя будет использовать дополнительное пространство.отметка-ясноилиОтметить-организоватьболее разумно.
алгоритм пометки-копии
Алгоритм метки-копии делит память на две области одинакового размера (типа области Survivor нового поколения).Каждый раз, когда элемент выделяется в одной из областей, когда память этой области заполнена, уцелевшие элементы будут скопированы в другую область памяти и очистят текущую область памяти.
- Недостаток: тратить половину памяти.
- Достоинства: Просто и эффективно.
JVM сохраняет новые объекты в области Eden, а во время GC копирует уцелевшие объекты в Eden и Survivor в другой раздел Survivor. Это оптимизация алгоритма репликации JVM. Только 1/10 пространства памяти тратится впустую [отношение области JVM Eden к области Survivor составляет 8: 2]
алгоритм маркировки-развертки
Алгоритмы включаютотметкаа такжеЧистоВ два этапа маркируются уцелевшие объекты, а немаркированные объекты восстанавливаются равномерно (это общий случай) или, наоборот, все объекты, которые необходимо восстанавливать, помечаются и восстанавливаются (стоимость маркировки относительно велика).
- Преимущества: Самый простой алгоритм сбора данных, относительно простой.
- Недостатки: низкая эффективность (если нужно пометить много объектов), проблема с пространством (после очистки пометки будет генерироваться много прерывистого пространства в памяти)
Возможные проблемы с нехваткой места: после GC из памяти восстанавливается большое количество мертвых объектов и появляется большой объем свободной памяти.В это время система генерирует большой объект, который может не сгенерировать объект, т.к. недостаточно непрерывной памяти. [Достаточно места, но недостаточно большого непрерывного пространства]
алгоритм маркировки-сопоставления
Решена проблема с пространством при очистке разметки.
Процесс маркировки по-прежнему такой же, как и в алгоритме «маркировка-очистка», но вместо непосредственного восстановления перерабатываемых объектов последующие шаги перемещают все уцелевшие объекты в один конец, а затем непосредственно очищают память за пределами конечной границы.
уборщик мусора
В настоящее время основными сборщиками мусора на рынке являются: серийный сборщик,Параллельный сборщик мусора[коллектор JDK8 по умолчанию], сборщик ParNew,Сборщик CMS,коллектор G1.
Сборщик серийных номеров | -XX:+UseSerialGC -XX:+UseSerialOldGC
Однопоточный сборщик мусора, самый старый сборщик мусора, «ОСТАНОВИТ МИР» во время выполнения последовательного сборщика.
STOP THE WORLD: запускать только поток GC, приостанавливать другие потоки.
В новом поколении используется алгоритм репликации, а в старом поколении используется алгоритм маркировки-сопоставления.
Это просто и эффективно (по сравнению с однопоточными другими сборщиками). Последовательный сборщик может обеспечить высокую эффективность однопоточного сбора без накладных расходов на взаимодействие потоков.
Сборщик Parallel Scavenge | -XX:+UseParallelGC -XX:+UseParallelOldGC
Как и в многопоточной версии сборщика Serial, количество включенных по умолчанию потоков GC совпадает с количеством ядер ЦП (-XX:ParallelGCThreads может изменять количество потоков GC, ноМодификация не рекомендуется)
В центре внимания сборщика Parallel Scavenge находится пропускная способность (эффективное использование ЦП). Сборщики мусора, такие как CMS, больше заботятся о времени паузы пользовательских потоков (улучшении взаимодействия с пользователем). Так называемая пропускная способность — это отношение времени, затраченного на выполнение пользовательского кода в ЦП, к общему времени потребления ЦП.
Сборщик ParNew | -XX:+UseParNewGC
Сборщики ParNew и Parallel Scavenge очень хорошо знакомы, и можно понять, что ParNew за сотрудничествоСборщик CMSРазработано новое поколение коллекторов Parallel Scaenge.
Сборщик CMS | -XX:+UseConcMarkSweepGC
Сборщик CMS является сборщиком мусора в области старого поколения и часто используется вместе с сборщиком ParNew.
Он подходит для использования в приложениях, ориентированных на взаимодействие с пользователем, и реализует параллельное выполнение потоков GC и пользовательских потоков (часть шагов).
Усыновленныйотметка-ясноалгоритм. Процесс переработки условно делится на 5 этапов:
- начальная отметка: приостанавливать другие потоки (STW), помечая объекты, на которые непосредственно ссылаются корни GC.процесс быстрый
- одновременная маркировка: найти все объекты, на которые есть ссылки, из объектов, на которые непосредственно ссылаются корни GC. Этот процесс занимает больше всего времени и выполняется одновременно с пользовательским потоком. [Возможные проблемы в этом процессе: при выполнении пользовательских потоков может генерироваться новый мусор (плавающий мусор), который нельзя пометить. 】
- Переименовать: для исправленияодновременная маркировкаИдентификация объекта, которая изменилась втрехцветный маркерАлгоритм инкрементного обновления в . Этот процесс приостанавливает другие процессы (STW).
- Параллельная очистка: перерабатывать объекты, помеченные как перерабатываемые, и выполнять их одновременно с пользовательскими потоками. [*Этот процесс также создаст новые объекты мусора (плавающий мусор), которые будут переработаны при следующем сборщике мусора]
- Параллельный сброс: снимите флажок для объектов, помеченных как не подлежащие вторичной переработке.
Сборщик G1 | -XX:+UseG1GCОфициальный сайт
структура кучи
Сборщик G1 применяет совершенно другой метод выделения памяти кучи, отличный от предыдущего, он делит память кучи на 2048 областей одинакового размера (Один размер 1 МБ ~ 32 МБ).
выделение памяти в куче
Эти регионы логически и динамически разделены на Эдем, Выживший (новое поколение) и Старое поколение (старое поколение). Эти регионы не обязательно являются смежными.
В дополнение к этим трем, G1 также добавляет новый тип: Огромные регионы. Если объект превышает 50% регионов, в которых он находится, он будет перемещен в регион этого типа.Следует избегать таких крупных объектов, насколько это возможно.
Ожидания GC-STW время
G1 добавляет новую конфигурацию (-XX:MaxGCPauseMillis=200), чтобы установить время ожидания каждого GC-STW. Это относительное значение и не будет выполняться строго в соответствии с этим временем.JVM оценит общее время GC.Если ожидаемое время не может быть соблюдено, JVM будет использовать определенный алгоритм для восстановления только части рентабельной памяти пространство для достижения этой цели.
Young GC
При инициализации памяти нового поколения по умолчанию выделяется 5 % памяти кучи. Когда память нового поколения заполнена, JVM оценит время, необходимое для повторного использования нового поколения. Если оно короче ожидаемого времени GC-STW, Young GC не будет запускаться сразу, а будет разворачивать новое поколение. В противном случае активируйте Young GC.
Молодой GC реплицирует уцелевшие объекты в регион Survivor с помощью алгоритма репликации. И очистить исходный регион.
- Этот процесс «остановит мир», а также пересчитать и сохранить размер молодого поколения, чтобы следующий сборщик мусора мог выполняться быстро.
- молодой GC является многопоточным.
Mixed GC
Смешанный сборщик мусора запускается, когда вся куча заполняется (-XX:InitiatingHeapOccupancyPercent=45).
Смешанный процесс GC
- начальная отметка: приостанавливать другие потоки (STW), помечая объекты, на которые непосредственно ссылаются корни GC.процесс быстрый
- одновременная маркировка: найти все объекты, на которые есть ссылки, из объектов, на которые непосредственно ссылаются корни GC. Этот процесс занимает больше всего времени и выполняется одновременно с пользовательским потоком. [На официальном сайте написано, что здесь будет отмечена пустая область ---- Я пока не могу этого понять, я с нетерпением жду понимания больших парней, чтобы просветить меня~~~]
- перемаркировать: для исправленияодновременная маркировкаИдентификатор объекта, который изменился в этом процессе, приостановит другие процессы (STW). [Затем на этом этапе используется пустая область]
- Параллельная очистка: На этом этапе G1 будетстаростьКаждый регион сравнивается, и регион с низкой «активностью» будет преимущественно перерабатываться (Живучесть: наименьшее количество выживших объектов, низкая стоимость репликации, более быстрое восстановление). Старое поколение и молодое поколение перерабатываются вместе.
- Копировать выживший объект: Копирует уцелевшие объекты из ранее восстановленного региона в неиспользуемый регион и уплотняет его.
Официальная рекомендация G1
-
Не устанавливайте свой размер
- Установка размера молодого поколения отключает цель, которая ожидает время GC-STW.
- G1 больше не может расширять и сужать пространство для подрастающего поколения по мере необходимости. Размеры не могут быть изменены, потому что размеры фиксированы.
-
Ожидаемое время GC-STW
- Лучше не задавать среднее время GC, а использовать 90% времени GC.
-
Ошибка эвакуации в смешанном GC
- Ошибка эвакуации возникает, когда больше нет свободных областей, повышенных до старого поколения или скопированных в оставшееся пространство, и куча не может расширяться, поскольку куча достигла своего максимального значения. В этот момент будет запущен полный GC,Однопоточная сборка мусора, аналогичная последовательному сборщику, очень трудоемкая.
- Увеличьте размер (-XX:G1ReservePercent=10)
- Уменьшить (-XX:InitiatingHeapOccupancyPercent=45) размер
- Увеличить (-XX:ConcGCThreads=n) количество параллельных потоков маркировки
Пожалуйста, обратитесь к официальному сайту для параметров G1 JVM.