Обмен технологиями

[Основы JVM] Введение в сборщик мусора Java

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Сборщик мусора (реализация алгоритма сбора мусора)

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

Конкретные комбинированные отношения заключаются в следующем:

Вставьте сюда описание изображения

В базовом исходном коде JVM в некоторых особых случаях переработчик CMS вызывает переработчик Serial Old.

Артас осматривает использованный сборщик мусора

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

Вставьте сюда описание изображения

Серийный сборщик мусора «Молодое поколение»

Сериал - этоОднопоточный сериальный сборник молодого поколенияСборщик мусора.

Вставьте сюда описание изображения

Возраст и алгоритмы переработки

  • молодое поколение
  • Алгоритм репликации

преимущество

Отличная пропускная способность на однопроцессорном процессоре

недостаток

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

Применимая сцена

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

как использовать

-XX: UseSerialGC: И новое поколение, и старое поколение используют серийный коллектор.

Старое поколение-SerialOld сборщик мусора

SerialOld — это версия последовательного сборщика мусора старого поколения, использующаяОднопоточный серийный сбор

Вставьте сюда описание изображения

Возраст и алгоритмы переработки

  • старость
  • Алгоритм сопоставления меток

преимущество

Отличная пропускная способность на однопроцессорном процессоре

недостаток

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

Применимая сцена

Используется с последовательным сборщиком мусора или в особых случаях CMS.

как использовать

-XX: UseSerialGC: И новое поколение, и старое поколение используют серийный коллектор.

Молодое поколение-ПарНовый сборщик мусора

Сборщик мусора ParNew, по сути,Оптимизация последовательного порта под несколько процессоров, используя многопоточность для сборки мусора

Вставьте сюда описание изображения

Возраст и алгоритм переработки:

  • молодое поколение
  • Алгоритм репликации

преимущество

  • Сокращение времени паузы в многопроцессорных процессорах

недостаток

  • Пропускная способность и время паузы не так хороши, как у G1, поэтому не рекомендуется после JDK9.

Применимая сцена

  • В JDK8 и предыдущих версиях он используется совместно со сборщиком мусора CMS старого поколения.

как использовать

  • -XX: UseParNewGC: Новое поколение использует сборщик ParNew, а старое поколение — серийный сборщик.

Вставьте сюда описание изображения

Сборщик мусора CMS старого поколения (Concurrent Mark Sweep)

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

Возраст и алгоритмы переработки

  • старость
  • Алгоритм маркировки и развертки

преимущество

  • Время паузы системы из-за сбора мусора короче, а взаимодействие с пользователем становится лучше.

недостаток

1. Проблема фрагментации памяти

2. Проблема деградации (в некоторых конкретных случаях вырождается в однопоточный сборщик типа SerialOld)

3. Проблема плавающего мусора (некоторый мусор не может быть переработан в процессе переработки)

Применимая сцена

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

использовать

XX: UseConcMarkSweepGC, можно установить коллекционеров молодого поколения и старого поколения соответственно.

Вставьте сюда описание изображения

Вставьте сюда описание изображения

Этапы выполнения CMS

  1. Первичная разметка, разметка в кратчайшие срокиОбъекты, к которым могут напрямую относиться GC Roots
  2. одновременная маркировка, Отметьте все объекты , пользовательский поток не нужно приостанавливать. (Хотя параллельная маркировка выполняется вместе с пользовательским потоком, если ресурсы, занятые параллельной маркировкой, высоки, это также повлияет на пользовательский поток)
  3. Перемаркировка (параллелизм), поскольку некоторые объекты будут меняться во время фазы одновременной маркировки, будет неправильная маркировка (использованный объект изначально был живым, но после маркировки пользовательский поток сделал его нежизнеспособным, что привело к неправильной маркировке), отсутствие маркировки (Потому что он является параллельным, некоторые объекты могут быть только что созданы пользовательским потоком, что приведет к отсутствию тегов) и другим ситуациям, и их необходимо будет перемаркировать.
  4. Параллельная очистка, очистка мертвых объектов, пользовательские потоки не нужно приостанавливать.

Примечание. STW появится только на этапах начальной маркировки и повторной маркировки.

Вставьте сюда описание изображения

недостаток:

1. CMS использует алгоритм пометки и очистки. После завершения сборки мусора появится большое количество фрагментов памяти. Чтобы не влиять на распределение объектов.CMS выполнит дефрагментацию во время полного сбора мусора. . Это приведет к остановке пользовательского потока,Вы можете использовать параметр -XX:CMSFullGCsBeforeCompaction=N (по умолчанию 0), чтобы настроить полный сборщик мусора N раз перед его сортировкой.

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

3. Если в старом поколении недостаточно памяти для размещения объектов, CMS переродится в Serial Old с однопоточной переработкой старого поколения.

Количество одновременных потоков:

Количество потоков при выполнении параллельного этапа в CMS может быть передано-XX:ConcGCThreadsНастройки параметров рассчитываются системой, и формула расчета:(-XX:ParallelGCThreads定义的线程数 3) / 4, ParallelGCThreads — количество параллельных потоков после паузы STW.

ParallelGCThreads определяется количеством ядер процессора:

1. Если количество ядер ЦП меньше 8, ParallelGCThreads = Количество ядер ЦП.

2. В противном случае ParallelGCThreads = 8 (Количество ядер ЦП – 8)*5/8.

На моем компьютере 12 логических процессоров, поэтому ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: количество потоков, определенных ParallelGCThreads 3)/4 = (10 3)/4 = 3

Вставьте сюда описание изображения

Наконец вы можете получить вот эту картинку:

Вставьте сюда описание изображения

Одновременные этапы маркировки и одновременной очистки будут обрабатываться параллельно с использованием трех потоков. Фаза повторной маркировки будет обрабатываться с использованием 10 потоков. Поскольку количество ядер ЦП ограничено, параллельная фаза будет влиять на производительность выполнения пользовательских потоков.

Вставьте сюда описание изображения

Сборщик мусора «Молодое поколение» с параллельной очисткой

Параллельная очистка — этоJDK8 сборщик мусора молодого поколения по умолчанию,МногопоточностьПараллельный сборСосредоточьтесь на пропускной способности системы .Чтобы увеличить пропускную способность, PS будетАвтоматически корректировать размер кучи (регулировать размер памяти нового поколения, размер памяти старого поколения, порог продвижения)

Вставьте сюда описание изображения

Возраст и алгоритмы переработки

  • молодое поколение
  • Алгоритм репликации

преимущество

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

недостаток

  • Нет гарантии единого времени паузы, но поддерживается установка времени STW.

Применимая сцена

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

Общие параметры

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

  • максимальное время паузы,-XX:MaxGCPauseMillis=n Установите максимальное количество миллисекунд для паузы для каждой сборки мусора.
  • пропускная способность,-XX:GCTimeRatio=n Установите пропускную способность на n (время выполнения пользовательского потока = n/(n 1))
  • Автоматически регулировать размер памяти, -XX: UseAdaptiveSizePolicyЭтот параметр позволяет сборщику мусора автоматически регулировать размер памяти в зависимости от пропускной способности и максимального значения паузы в миллисекундах. Этот параметр включен по умолчанию (Oracle рекомендует при использовании комбинации PS не задавать максимальный размер кучи и позволить сборщику мусора автоматически настраивать).

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

Старое поколение-Параллельный старый сборщик мусора

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

Вставьте сюда описание изображения

Возраст и алгоритмы переработки

  • старость
  • Алгоритм маркировки и сортировки (на самом деле сортировка маркировки и очистки)

преимущество

  • Параллельный сбор более эффективен при использовании многоядерных процессоров.

недостаток

  • Время паузы будет больше

Применимая сцена

  • Используется с параллельной очисткой

как использовать

JDK8 устанавливает параметры для использования этого переработчика по умолчанию.

параметр:-XX: UseParallelGC или-XX: UseParallelOldGCВы можете использовать комбинацию Parallel Scavenge Parallel Old.
Вставьте сюда описание изображения

Вставьте сюда описание изображения

тест

-XX: PrintFlagsFinal: Вы можете распечатать окончательные значения всех элементов конфигурации при запуске программы. Вы можете проверить, включена ли функция автоматической настройки.

Вставьте сюда описание изображения

Вставьте сюда описание изображения

Вставьте сюда описание изображения

Вставьте сюда описание изображения

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收器案例3
 */
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC  -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC   -Xmn8g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal  -XX:GCTimeRatio = 19  -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {

    public static void main(String[] args) throws IOException {
        int count = 0;
        List