Анализ алгоритмов GC в статьях серии JVM

Java задняя часть JVM алгоритм

Структура кучи Java

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

В Java 1.8 модель кучи памяти выглядит примерно так:

heap

Размер кучи = молодое поколение + старое поколение. где размер кучи может быть передан как параметр-Xms,-Xmxуказать.

По умолчанию соотношение молодого поколения (Young) к старому поколению (Old) составляет 1:2 (это значение можно указать параметром -XX: NewRatio), то есть:Молодое поколение (Young) = 1/3 размера кучи, а старое поколение (Old) = 2/3 размера кучи.

Среди них новое поколение (Молодое) ​​подразделяется на Эдем и два региона Выживших, которые названы от и до соответственно для отличия.

По умолчанию Eden:from:to = 8:1:1 (можно задать параметром -XX:SurvivorRatio), а именно:Эдем = 8/10 размера пространства молодого поколения, от = до = 1/10 размера пространства молодого поколения.

JVM использует только Eden и одну из областей Survivor для одновременного обслуживания объектов, поэтому независимо от того, когда, всегда есть свободная область Survivor, а фактическое доступное пространство памяти нового поколения составляет 90% нового поколения. пространство.

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

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

mark_sweep
Алгоритм маркировки-развертки имеет два недостатка:

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

ГХ на основе Mark-Sweep в основном используется в пожилом возрасте.

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

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

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

copy

Виртуальная точка доступаКомпьютер разделяет память нового поколения на большее пространство Эдема и два меньших пространства Выживших, соотношение размеров Эдема и Выжившего составляет 8:1.. Доступный объем памяти в каждом молодом поколении составляет 90% всей емкости молодого поколения. Мы никак не можем гарантировать, что не более 10% объектов выживет после каждой коллекции.Когда места Survivor недостаточно, ему нужно полагаться на старость для гарантии распределения..

Алгоритмы организации тегов

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

Алгоритмы организации теговМожет решить проблему фрагментации памяти, а идея относительно проста, ее идея состоит в том, чтобы переместить все уцелевшие объекты в один конец, а затем непосредственно очистить память за границей, как показано на следующем рисунке:

mark-compact

Коллекция поколений

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

  • Кайнозой
    • Алгоритм сбора копий
  • старость
    • алгоритм очистки меток
    • Алгоритмы организации тегов

Простое сравнение трех основных алгоритмов

Следующий анализ относится к анализу R алгоритма GC:Позже Лу Мэн.group.ITeye.com/group/topic…

В генерационном GC обычно используется старое поколениеmark-sweep(алгоритм маркировки-развертки), или гибридный метод маркировки-развертки/маркировки-компактности, в общем случае используется маркировка-развертка, а маркировка-компактность (mark-compact) применяется, когда статистическая оценка фрагментации достигает определенного уровня. Это связано с тем, что традиционно считается, что объекты в пожилом возрасте могут долго сохраняться и иметь высокую выживаемость, либо быть относительно большими, что копировать нерентабельно, и лучше использовать сбор на месте. .Mark-Sweep,Mark-compact,copyingСреди этих трех основных алгоритмов только mark-sweep не перемещает объекты (то есть не копирует), поэтому mark-sweep часто используется в старости. Конечно, для разных сборщиков мусора алгоритм GC разный.

Вот сравнение трех алгоритмов:

mark-sweep mark-compact copying
скорость Средняя самый медленный самый быстрый
пространство над головой Меньше (но будет накапливаться мусор) Меньше (без скопления мусора) Обычно требуется в 2 раза больше живого объекта (без нагромождения мусора)
движущиеся объекты? нет да да

О стоимости времени:

  • mark-sweep: пометить фазу иколичество живых объектовпропорциональна фазе развертки иразмер кучипропорциональный
  • mark-compact: пометить фазу живыми объектамиколичествопропорциональна размеру компактной фазы живого объектаразмерпропорциональный
  • копия: сразмер живого объектапропорциональный

Если объединить трудоемкие действия пометки, очистки, уплотнения и копирования, получится примерно следующее соотношение:

compaction >= copying > marking > sweeping marking + sweeping > copying

В заключение:

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

Когда старость GCed, вероятность выживания объекта может быть очень высокой, и предполагается, что свободного места не так много, поэтому алгоритм копирования не подходит, поэтому с большей вероятностью будут использоваться два других алгоритма, особенно алгоритм Mark-Sweep, который не требует перемещения объектов

Однако все сборщики, кроме сборщика CMS в HotSpot VM, будут перемещать объекты, то есть либо копирование, либо вариант пометки-компакта

Параметры настройки памяти кучи JVM

  • -XX:+<option>Включить параметры Например: -XX:+PrintGCDetails включает параметр для печати информации GC, где знак + означает «истина», что означает «открыто».
  • -XX:-<option>Не включайте опции, например: -XX:-PrintGCDetails закрывает опцию запуска печати информации GC, где -sign означает ложь, что означает закрытие
  • -XX:<option>=<number>
  • -XX:<option>=<string>

Общие параметры кучи

  • -Xms: начальный размер кучи
  • -Xmx: максимальный размер кучи, по умолчанию 1/4 физической памяти.
  • -Xmn: размер молодого поколения, обычно 1/3 или 1/4 от Xmx. Молодое поколение = Эдем + 2 места для выживших. Фактическое свободное место = Эдем + 1 выживший, или 90%
  • -XX:NewSize=n: установить размер нового поколения
  • -XX:NewRatio = n: установить соотношение нового поколения к старому, например, n = 3, что означает новое поколение: старое поколение = 1:3.
  • -XX:SurvivorRatio: Соотношение Эдема и Выжившего в новом поколении, значение по умолчанию равно 8. То есть Эдем занимает 8/10 пространства нового поколения, а два других Выживших занимают по 1/10.
  • -XX:PermSize: начальный размер постоянного поколения (область метода) (при условии, что постоянное поколение существует, в JDK 1.8 и более поздних версиях постоянное поколение удалено).
  • -XX:MaxPermSize: максимальное значение постоянного поколения (область метода)
  • -XX:+PrintGCDetails: распечатать информацию о сборщике мусора
  • -XX:+HeapDumpOnOutOfMemoryError: позволить виртуальной машине сделать дамп текущего снимка дампа кучи памяти при переполнении памяти, чтобы его можно было использовать для анализа.

Дополнительные настройки параметров JVM см. в соответствующей информации на официальном веб-сайте Oracle:Woohoo. Сеть Oracle.com/tech…

резюме

Вышеизложенное в основном относится к книге "Углубленное понимание виртуальной машины Java" и анализу R University алгоритмов GC. Я негодяй для JVM. Если у вас есть какие-либо вопросы, пожалуйста, укажите

Кроме того, для более подробного объяснения алгоритма мусора, для конкретной реализации трех алгоритмов, обратитесь к Nakamura Chengyang's«Алгоритмы и реализации сборки мусора»

Ссылки и благодарности