Что ж, после многих поисков и исследований я понял следующее:
-XX: + UseParallelGC - это позволяет GC использовать несколько потоков in Молодое поколение , но для старого / старшего поколения все еще Используется алгоритм Serial Mark and Compact .
-XX: + UseParallelOldGC -Это позволяет GC использовать Parallel Mark и Compact алгоритм в старом / постоянном поколении.
Давайте разберемся -
Алгоритм и расположение памяти,например, пометка и копирование, обмен местами, который работает в Молодое поколение не работает для Старое поколение по многим причинам
Низкая смертность - В старом поколении «уровень смертности» значительно ниже, чем в молодом поколении.В типичном Java-приложении большинство объектов быстро умирают, а немногие живут дольше.Как объекты, которые выживают в молодом поколении и продвигаются к старому поколению, наблюдается, что эти объекты стремятся жить дольше.Что приводит к очень меньшей смертности в старом поколении по сравнению с молодым поколением.
Значительный размер - Старое поколение значительно больше, чем молодое поколение.Поскольку молодое поколение быстро проясняется, для многих недолговечных объектов (относительно маленького молодого поколения) доступно относительно мало места.В старом поколении объекты накапливаются со временем.Следовательно, в старом поколении должно быть гораздо больше места, чем в молодом поколении (большое старое поколение)
небольшое распределение - в старом поколении происходит меньшее распределение, чем в молодом поколении.Это потому, что в старом поколении объекты возникают только тогда, когда сборщик мусора продвигает уцелевшие объекты от молодого к старому поколению.В молодом поколении, с другой стороны, все объекты, которые приложение генерирует с новым, то есть большинство распределений, встречаются в молодом поколении.
С учетом этих различий для молодого поколения был выбран алгоритм, который завершит сбор мусора как можно скорее, потому что его приходится часто вызывать из-за высокого уровня смертности [пункт (1)].Кроме того, алгоритм должен обеспечить максимально эффективное распределение памяти [точка (3)], поскольку в молодом поколении выделяется много.Алгоритм пометки и копирования в Молодом Поколении обладает этими свойствами.
С другой стороны, , этот алгоритм не имеет смысла для Старого Поколения.Ситуация иная: сборщик мусора должен заботиться о многих объектах в старом поколении [пункт (2)], и большинство из них все еще живы;только небольшая часть стала недоступной и может быть освобождена [пункт (1)].Если бы сборщик мусора копировал все выжившие объекты в каждой сборке мусора, так же, как это делает метка-и-копия, то он потратил бы много времени, копируя его, не получая много.
Поэтому , алгоритм mark-and-sweep создан для старого поколения, где ничего не копируется, а просто недоступные объекты освобождаются.Поскольку этот алгоритм приводит к фрагментации кучи, дополнительно рассматривается вариант алгоритма разметки и развертки, в котором после фазы развертки выполняется сжатие, с помощью которого фрагментация снижается.Этот алгоритм называется алгоритмом mark-and-compact .
A mark и compact алгоритма может занимать много времени, так как для его обхода необходимо выполнить следующие действия:Этапы.
- Маркировка.
- Расчет новых локаций.
- Справочные настройки.
- Перемещение
В фазе Вычисление новой локации , когда она получает свободное пространство, пытается найти объект, который может переместиться в это пространство ( дефрагментация ).Сохраняет пару для использования на более поздних этапах.Это приводит к тому, что алгоритм занимает больше времени.
Хотя отметка и сравнение решают некоторые проблемы, относящиеся к генерации с постоянным доступом, у него есть серьезная проблема, поскольку это событие STW (остановка мира), и оно потребляет много времени, можетсерьезно повлиять на приложение.
Альтернативные алгоритмы для старого поколения
Для сокращения времени разрыва были рассмотрены альтернативы последовательному алгоритму разметки и компактности.:
Параллельный разметочный и компактный алгоритм , который по-прежнему фиксирует все потоки приложения, но затем обрабатывает маркировку и последующее сжатие с помощью нескольких потоков сборщика мусора.Несмотря на то, что это по-прежнему подход «остановка мира», результирующая пауза на многоядерном или многопроцессорном компьютере короче, чем в последовательном алгоритме разметки и компактности.Этот параллельный алгоритм в старом поколении (называемый «ParallelOld») был доступен после Java 5 Update 6 и выбирается с параметром -XX: + UseParallelOldGC .
A конкурирующийалгоритм mark-and-sweep , который хотя бы частично конкурирует с приложением, не останавливая его потоки, и иногда нуждается в коротких этапах остановки мира.Этот параллельный алгоритм разметки и развертки (называемый «CMS») существует с Java 1.4.1;он включается с опцией -XX: + UseConcMarkSweepGC.Важно отметить, что это всего лишь алгоритм метки и развертки;Сжатие не происходит, что приводит к уже обсуждаемой проблеме фрагментации.
Таким образом, в двух словах: -XX: + UseParallelOldGC используется в качестве указания на использование нескольких потоков при выполнении основного сбора с использованием Mark and Compact алгоритм.Если используется вместо этого, младшая или младшая коллекция параллельны, но основные коллекции все еще однопоточные.
Я надеюсь, что это ответ.