2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Сборщик мусора — это конкретная реализация алгоритма сборки мусора. . Так как сборщик мусора делится на молодое поколение и старое поколение, помимо G1 (который может управлять как новым поколением, так и старым поколением),Сборщики мусора нового и старого поколения должны использоваться парами в соответствии с требованиями точки доступа.(Вам необходимо выбрать соответствующую комбинацию согласно версии JDK)
Конкретные комбинированные отношения заключаются в следующем:
В базовом исходном коде JVM в некоторых особых случаях переработчик CMS вызывает переработчик Serial Old.
Вы не можете напрямую увидеть, какой сборщик мусора используется, вы можете только сделать вывод на основе алгоритма.
Сериал - этоОднопоточный сериальный сборник молодого поколенияСборщик мусора.
Отличная пропускная способность на однопроцессорном процессоре
Пропускная способность при использовании нескольких процессоров не так хороша, как у других сборщиков мусора (однопоточных, с использованием только одного процессора). Если куча слишком велика, пользовательский поток будет ждать долгое время.
Клиентские программы, написанные на Java, или сценарии с ограниченной аппаратной конфигурацией (небольшое количество ядер ЦП).
-XX: UseSerialGC
: И новое поколение, и старое поколение используют серийный коллектор.
SerialOld — это версия последовательного сборщика мусора старого поколения, использующаяОднопоточный серийный сбор
Отличная пропускная способность на однопроцессорном процессоре
Пропускная способность в многопроцессорном режиме не так хороша, как у других сборщиков мусора. Если куча слишком велика, пользовательский поток будет ждать долгое время.
Используется с последовательным сборщиком мусора или в особых случаях CMS.
-XX: UseSerialGC
: И новое поколение, и старое поколение используют серийный коллектор.
Сборщик мусора ParNew, по сути,Оптимизация последовательного порта под несколько процессоров, используя многопоточность для сборки мусора
-XX: UseParNewGC
: Новое поколение использует сборщик ParNew, а старое поколение — серийный сборщик.Сборщик мусора CMS фокусируется на времени паузы системы (чтобы минимизировать STW и оптимизировать взаимодействие с пользователем).Разрешить пользовательским потокам и потокам сборки мусора выполняться одновременно на определенных шагах., сокращая время ожидания пользовательских потоков.
1. Проблема фрагментации памяти
2. Проблема деградации (в некоторых конкретных случаях вырождается в однопоточный сборщик типа SerialOld)
3. Проблема плавающего мусора (некоторый мусор не может быть переработан в процессе переработки)
Сценарии в крупномасштабных интернет-системах, где пользователи запрашивают большие объемы данных и с высокой частотой, например интерфейсы заказов, интерфейсы продуктов и т. д.
XX: UseConcMarkSweepGC
, можно установить коллекционеров молодого поколения и старого поколения соответственно.
Примечание. 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 будетАвтоматически корректировать размер кучи (регулировать размер памяти нового поколения, размер памяти старого поколения, порог продвижения)。
Параллельная очистка позволяет вручную устанавливать максимальное время паузы и пропускную способность. Представители 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