Здравствуйте, меня зовут Джек Сюй. Мы знаем, что настройка JVM в основном связана с настройкойВыбор сборщика мусораа такжеУстановка параметров, значит надо освоить знание сборки мусора, иначе как настраивать, то что такое мусор, мы аналог мусора в жизни, то есть вещи которые не нужны, вещи которые надо убрать, то первый шаг найти мусор, в Java у нас есть два пути.
Как определить мусор
подсчет ссылок
Добавьте к объекту счетчик ссылок, и каждый раз, когда на него есть ссылка, значение счетчика равно +1. Когда ссылка истекает, значение счетчика равно -1. Объект со счетчиком 0 в любое время невозможно использовать, он оценивается как недостижимый и ожидает очистки gc. Этот метод почти выброшен, потому что, если AB содержит ссылки друг на друга, он никогда не будет переработан.Давайте посмотрим на следующий код. .
/**
* @author jack xu
*/
public class ReferenceCount {
public Object instance = null;
public static void main(String[] args) {
testGC();
}
public static void testGC() {
ReferenceCount a = new ReferenceCount();
ReferenceCount b = new ReferenceCount();
a.instance = b;
b.instance = a;
a = null;
b = null;
}
}
Наконец, когда вы посмотрите на рисунок ниже, вы увидите, что доступ к этим двум объектам больше невозможен, но, поскольку они ссылаются друг на друга, их счетчики ссылок никогда не будут равны 0. Благодаря алгоритму подсчета ссылок они будут всегда быть Невозможно сказать сборщику GC, чтобы он перерабатывал их.Это приводит к утечке памяти, что в конечном итоге приводит к переполнению памяти.
Анализ доступности
Основная идея алгоритма анализа достижимости состоит в том, чтобы использовать в качестве отправной точки некие объекты, называемые цепочками ссылок (GC Roots), и начинать поиск вниз от этих узлов, а путь поиска называется (Reference Chain). цепочка ссылок, подключенная к GC Roots (то есть узел недоступен из узла GC Roots), доказывает, что объект недоступен, как показано на следующем рисунке. .
В Java доступен в виде списка объектов GC Roots:
- Объекты, на которые есть ссылки в стеке виртуальной машины Java (таблица локальных переменных во фрейме стека)
- Объект, на который ссылается JNI (то есть собственный метод в целом) в стеке собственных методов.
- Объект, на который ссылается статическое свойство класса в области метода
- Ссылочный объект для константы в области метода.
- загрузчик классов
- Класс потока
Алгоритм сборки мусора
После определения того, какой мусор можно собирать, сборщик мусора должен начать сборку мусора, но здесь возникает проблема:Как эффективно выполнять сборку мусора?Всего есть три алгоритма.
Марк-развертка
Это самый простой алгоритм сборки мусора.Алгоритм маркировки-очистки делится на две фазы: фазу маркировки и фазу очистки. Фаза маркировки состоит в том, чтобы пометить все объекты, которые необходимо вернуть, а фаза очистки состоит в том, чтобы вернуть пространство, занимаемое отмеченными объектами.недостаток:
- Положение прерывистое, что приводит к фрагментации
- Низкая эффективность, два сканирования, маркировка и очистка занимают много времени
Алгоритм копирования (копирование)
Для устранения недостатков алгоритма Mark-Sweep был предложен алгоритм копирования. Он делит доступную память на два блока одинакового размера по емкости и использует только один из них за раз. Когда память этого блока израсходована, уцелевшие объекты копируются в другой блок, а затем одновременно очищается используемое пространство памяти, так что проблема фрагментации памяти возникает нелегко.
Преимущества: отсутствие фрагментации, сплошное пространство
недостаток:50% пространства памяти всегда простаивает и тратится впустую!
Марк-Компакт
Для устранения недостатков алгоритма копирования и полного использования пространства памяти предлагается алгоритм Mark-Compact. Фаза маркировки алгоритма аналогична Mark-Sweep, но вместо того, чтобы очищать повторно используемые объекты сразу после маркировки, он перемещает все выжившие объекты в один конец, а затем очищает память за границей конца.
Преимущества: отсутствие фрагментации, сплошное пространство
Недостатки: низкая эффективность, два скана, указатель нужно подстраивать
Алгоритм сбора поколений
Строго говоря, Generational Collection — это не идея или теория, а набор комбинаций различных алгоритмов, используемых для разных ситуаций, который получается путем объединения трех вышеупомянутых основных алгоритмических идей.
Мы знаем, что большинство объектов живут и умирают, поэтому мы делим кучу на новое поколение, старое поколение и бессмертное поколение (называемое метапространством в JDK8), чтобы они могли выполнять разные сборки мусора в соответствии с разными поколениями. Новое поколение далее разделено на зоны Eden (Эдем) и Survivor (выживший), и их соотношение составляет 8:1:1. Ниже я использую диаграмму, чтобы продемонстрировать процесс сборки мусора поколений:
Шаг 1: Вновь выделенные объекты будут помещены в Эдемский сад.Когда Эдемский сад заполнится, будет запущен младший сборщик мусора, и дополнительный сборщик мусора очистит весь неиспользуемый мусор в молодом поколении, включая s0 и s1.
Шаг 2: Объекты в Эдемском саду, которые не были очищены, являются теми, которые выжили, добавьте к их возрасту +1 и поместите их в область s0.
Шаг 3: После того, как Эдемский сад заполнится, снова активируйте малый gc.Возраст уцелевших объектов в Эдемском саду +1 помещается в область s1, а возраст уцелевших объектов в область s0 +1 помещается в область s1, так что область s0 свободна.Шаг 4: Повторите это
Шаг 5: После того, как область выживших достигает возраста, она входит в старость, по умолчанию 15 лет (по умолчанию в CMS 6 лет), этот возраст можно настроить самостоятельно.Шаг 6: Если память старого поколения заполнена, будет запущен основной сборщик мусора или полный сборщик мусора. Так называемый феномен STW (stop the world) возникает при срабатывании полного GC. Чем больше память, тем больше время STW, поэтому память не только лучше.
Прочитав приведенную выше диаграмму, мы знаем, что молодое поколение использует алгоритм копирования, так как большинство объектов имеют короткий жизненный цикл и очень часто перерабатываются, а алгоритм копирования эффективен; Алгоритм сортировки, т.к. в старом поколении Объекты выживают долго, и копировать и копировать не надо.
уборщик мусора
Сборщик мусора — это конкретная реализация алгоритма сборки мусора, грубо говоря, посадочная, введем следующие общие сборщики.
Serial/Serial Old
Сборщик Serial/Serial Old — самый простой и старый сборщик, однопоточный сборщик, и когда он выполняет сборку мусора, он должен приостанавливать все пользовательские потоки и останавливать The World. Серийный коллектор — это коллектор нового поколения, использующийCopyingалгоритм. Сборщик Serial Old — это сборщик для старого поколения, использующий алгоритм Mark-Compact. Его преимущество в том, что его просто и эффективно реализовать, а недостаток в том, что он принесет пользователямПауза. Управление параметрами: -XX:+UseSerialGC -XX:+UseSerialOldGC
ParNew
Сборщик ParNew на самом деле является многопоточной версией сборщика Serial, который выполняет сборку мусора параллельно с несколькими потоками. В многоядерном ЦП он более эффективен, чем последовательный, а в одноядерном ЦП похож на последовательный. Воздействуя на новое поколение, используйтекопироватьАлгоритм, используемый с CMS. Управление параметрами: -XX:+UseParNewGC
Parallel Scavenge/Parallel Old
Сборщик Parallel Scavenge — это новое поколение многопоточных сборщиков. он тожеПараллельная коллекция, выглядит так же, как ParNew, но Parallel Scanvenge уделяет больше внимания системепропускная способность, который используетCopyingалгоритм.
Parallel Old — более старая версия сборщика Parallel Scavenge, тоже параллельный сборщик, использующий многопоточность и алгоритм Mark-Compact, а также уделяющий больше внимания пропускной способности.
Управление параметрами: -XX:+UseParallelGC -XX:+UseParallelOldGC
CMS
Коллектор CMS (Concurrent Mark Sweep) — способ получить кратчайшее восстановлениевремя паузысборщик мишеней, этопараллельный коллектор, с использованиемАлгоритм маркировки-развертки.
Примечание для друзей: параллелизм относится к параллельному выполнению между потоками сборки мусора, а параллелизм относится к совместному выполнению пользовательских потоков и потоков сборки мусора.
Процесс его эксплуатации сложнее, чем у предыдущих коллекторов, весь процесс разбит на 4 этапа, в том числе:
- Начальная отметка (начальная отметка CMS)
- Параллельная отметка (одновременная отметка CMS)
- Замечание (замечание CMS)
- Параллельная проверка (одновременная проверка CMS)
Два этапа первоначальной маркировки и повторной маркировки по-прежнему требуют «Остановить мир».. Начальная маркировка предназначена только для маркировки объектов, с которыми GC Roots может напрямую ассоциироваться, что очень быстро.Этап параллельной маркировки - это процесс трассировки GC Roots Tracing, а этап повторной маркировки - для исправления маркировки, вызванной пользовательской программой. продолжая работать в течение периода одновременной маркировки.Запись маркировки части объекта, вызвавшей изменение, время паузы на этом этапе обычно немного больше, чем начальная стадия маркировки, но намного короче, чем время одновременной маркировки.
Поскольку поток-сборщик может работать с пользовательским потоком в течение самого продолжительного одновременного процесса маркировки и одновременной очистки во всем процессе, в общем случае процесс восстановления памяти сборщика CMS выполняется одновременно с пользовательским потоком.
Управление параметрами: -XX:+UseConcMarkSweepGC
G1
Коллектор G1 — это самое передовое достижение в области разработки технологии коллекторов на сегодняшний день, это коллектор для серверных приложений, которые могут в полной мере использовать преимущества многопроцессорных и многоядерных сред. Так что это параллельный и параллельный коллектор, и он можетУстановить время паузы. По сравнению с коллектором CMS коллектор G1 имеет следующие характеристики:
1,пространственная интеграция, коллектор G1 принимаетОтметить-организоватьАлгоритм не будет генерировать фрагментацию пространства памяти. Большие объекты выделяются без раннего запуска следующего GC, потому что невозможно найти непрерывное пространство.
2,предсказуемые паузы, что является еще одним важным преимуществом G1.Сокращение времени паузы является общей задачей G1 и CMS, но в дополнение к достижению низкой паузы, G1 также может установить предсказуемую модель времени паузы, позволяя пользователям четко указывать продолжительность In a временной отрезок N миллисекунд, время, затрачиваемое на сборку мусора, не должно превышать N миллисекунд, что почти является особенностью сборщиков мусора Java (RTSJ) реального времени.
Сборщик мусора, упомянутый выше, областью сбора является все новое поколение или старое поколение, а G1 уже не тот случай. При использовании сборщика G1 расположение памяти в куче Java сильно отличается от других сборщиков, оно делит всю кучу Java на несколько независимых областей (Regions) одинакового размера, хотя понятия нового поколения и старого поколения по-прежнему сохраняются. Но новое поколение и старое поколение больше не являются физическим разрывом, все они представляют собой совокупность части (может быть прерывистой) области.
Рабочий процесс выглядит следующим образом:
- Начальная маркировка: отметьте объекты, которые могут быть связаны с корнями GC, и измените значение TAMS, вам необходимо приостановить пользовательский поток.
- Параллельная маркировка: выполнение анализа достижимости из GC Roots, обнаружение уцелевших объектов и выполнение одновременно с пользовательскими потоками.
- Окончательная маркировка: чтобы исправить данные, которые изменяются из-за одновременного выполнения пользовательских программ на этапе параллельной маркировки, необходимо приостановить пользовательский поток.
- Скрининг и переработка (подсчет и эвакуация данных в реальном времени): отсортируйте значение и стоимость переработки для каждого региона и сформулируйте план утилизации в соответствии с ожидаемым пользователем временем паузы GC.
Управление параметрами: -XX:+UseG1GC
Выбор сборщика мусора
Выбор сборщика мусора в основном зависит от двух ключевых показателей:время паузыа такжепропускная способность.
- Время паузы: время, в течение которого сборщик мусора выполняет сборку мусора в ответе на выполнение терминального приложения.
- Пропускная способность: время выполнения пользовательского кода / (время выполнения пользовательского кода + время сборки мусора)
Чем короче время паузы, тем больше подходит программа, которая должна взаимодействовать с пользователем. Хорошая скорость отклика может улучшить взаимодействие с пользователем, а высокая пропускная способность позволяет эффективно использовать время ЦП и выполнять вычислительные задачи программы как можно быстрее. в основном подходит для фоновых вычислений без особых интерактивных задач.
Разобьем введенные выше сборщики мусора на категории.
- Параллельный сборщик [приоритет времени паузы]: CMS, G1 ----> подходит для сценариев с относительными требованиями ко времени, таких как Интернет
- Параллельный сборщик [приоритет пропускной способности]: Parallel Scanvent и Parallel Old ----> подходит для интерактивных сценариев, таких как научные вычисления, фоновая обработка и т. д.
- Серийный сборщик: Serial и Serial Old ----> подходит для небольшой памяти, встроенных устройств
Наконец, несколько слов.Когда Джеймс Гослинг проектировал Java в 1995 году, он не осознавал, что в будущем веб-разработок на этом языке будет больше.Время паузы меньше, чем сцена, все они сериализуются в начале и нужно остановить мир, это невообразимо сейчас.Представьте, что когда вы находитесь на Таобао и вы в приподнятом настроении, вдруг сайт не открывается.Вы можете это вынести? Позже постепенно появился стандарт PS+Parallel Old для Java 8, в котором приоритет отдавался пропускной способности, а позже у Java 8 и Java 9 были более высокие требования к времени, поэтому появились CMS, G1 и ZGC, которые не были представлены в этой статье, поэтому с время Прогрессивный сборщик мусора также постоянно трансформируется и модернизируется.
посмотри наконецофициальный сайт ОраклПодскажите как выбрать сборщик мусора, ведь все блоги переводятся и переводятся в интернете, что не очень правильно.На официальном сайте мы увидим более авторитетно.Оригинальность непроста, если вы считаете, что текст хороший, пожалуйста, поставьте лайк!