Сообщения

Показаны сообщения с ярлыком "Память в JVM"

Финализация, слабые, мягкие и фантомные ссылки и их влияние на сборку мусора в Java VM

Изображение
Финализация и слабые, мягкие и фантомные ссылки Некоторые приложения взаимодействуют со сборкой мусора с помощью финализации и слабых, мягких или фантомных ссылок. Эти функции могут создавать артефакты производительности на уровне языка программирования Java. Примером этого является завершение для закрытия файловых дескрипторов, что делает внешний ресурс (дескрипторы) зависимым от скорости сбора мусора. Полагаться на сборку мусора для управления ресурсами, отличными от памяти, почти всегда плохая идея. Явная сборка мусора Другой способ, с помощью которого приложения могут взаимодействовать со сборщиком мусора, - это явный вызов полной сборки мусора с помощью System.gc(). Это может привести к выполнению основной сборки, когда в этом нет необходимости (например, когда достаточно небольшой сборки), и поэтому в целом следует избегать. Влияние производительности явных сборщиков мусора можно измерить, отключив их с помощью флага -XX:+DisableExplicitGC, который заставляет виртуальную маш...

Z Сборщик мусора (ZGC) в Java VM

Изображение
Z Сборщик мусора (ZGC, Z Garbage Collector) - это масштабируемый сборщик мусора с малой задержкой. ZGC выполняет всю дорогостоящую работу конкурентно, не останавливая выполнение потоков приложений более чем на 10 мс, что делает его подходящим для приложений, требующих низкой задержки и/или использующих очень большую кучу (мульти-терабайты). Z Garbage Collector доступен в качестве экспериментальной функции и включен с параметрами командной строки -XX:+UnlockExperimentalVMOptions -XX:+UseZGC. Установка размера кучи Наиболее важным параметром настройки для ZGC является установка максимального размера кучи (-Xmx). Поскольку ZGC - это конкурентный коллектор, необходимо выбрать максимальный размер кучи, чтобы: 1) куча могла вместить живой набор вашего приложения, и 2) было достаточно места в куче, чтобы можно было обслуживать выделения, пока GC работает. Сколько необходимо запаса, очень сильно зависит от скорости распределения и реального размера приложения. В общем, чем больше памяти вы...

Настраиваемые значения по умолчанию для сборщика мусора G1

Изображение
В этом посте описываются значения по умолчанию и некоторые дополнительные сведения о параметрах командной строки. Параметр и значение по умолчанию Описание -XX:+G1UseAdaptiveConcRefinement -XX:G1ConcRefinementGreenZone=<ergo> -XX:G1ConcRefinementYellowZone=<ergo> -XX:G1ConcRefinementRedZone=<ergo> -XX:G1ConcRefinementThreads=<ergo> Конкурентное обновление запомненного набора (уточнение) использует эти параметры для управления рабочим распределением конкурентных потоков уточнения. G1 выбирает эргономические значения для этих опций, так что -XX:G1RSetUpdatingPauseTimePercent тратит время на паузу сборки мусора для обработки любой оставшейся работы, адаптивно корректируя их по мере необходимости. Изменяйте с осторожностью, потому что это может вызвать очень длинные паузы -XX:+ReduceInitialCardMarks Это объединяет конкурентную работу по обновлению (уточнению) запомненного набора для начальных распределений объектов. -XX:+ParallelRe...

Настройка сборщика мусора G1 для пропускной способности, для размера кучи

Изображение
Настройка для пропускной способности Политика G1 по умолчанию пытается поддерживать баланс между пропускной способностью и задержкой; однако существуют ситуации, когда желательна более высокая пропускная способность. Помимо уменьшения общего времени паузы, как описано в предыдущих постах, частота пауз может быть уменьшена. Основная идея заключается в том, чтобы увеличить максимальное время паузы с помощью -XX:MaxGCPauseMillis. Эвристика определения размера поколения автоматически адаптирует размер молодого поколения, что напрямую определяет частоту пауз. Если это не приводит к ожидаемому поведению, особенно на этапе восстановления пространства, увеличение минимального размера молодого поколения с помощью -XX:G1NewSizePercent заставит G1 сделать это. В некоторых случаях -XX:G1MaxNewSizePercent, максимально допустимый размер молодого поколения, может ограничивать пропускную способность, ограничивая размер молодого поколения. Это можно диагностировать, посмотрев итоговый вывод журнала п...

Тюнинг сборщика мусора G1 на задержку

Изображение
В этом разделе рассматриваются советы по улучшению поведения G1 в случае общих проблем с задержкой (latency), то есть, если время паузы слишком велико. Необычная система или использование в реальном времени Для каждой паузы сбора мусора вывод журнала gc+cpu=info содержит строку, содержащую информацию из операционной системы с разбивкой о том, где было проведено время паузы. Примером такого вывода является User=0.19s Sys=0.00s Real=0.01s. Пользовательское время (User) - это время, проведенное в коде виртуальной машины, системное время (Sys) - это время, проведенное в операционной системе, а реальное время (Real) - это количество абсолютного времени, прошедшего во время паузы. Если системное время относительно велико, то чаще всего причиной является среда. Общие известные проблемы для системного времени: Виртуальная машина, выделяющая или возвращающая память из памяти операционной системы, может вызвать ненужные задержки. Чтобы избежать задержек, задайте для одинакового значения ми...

Улучшение производительности сборщика мусора G1 в Java VM

Изображение
G1 предназначен для обеспечения хорошей общей производительности без необходимости указывать дополнительные опции. Однако существуют случаи, когда эвристика по умолчанию или конфигурации по умолчанию для них дают неоптимальные результаты. В этом разделе приведены некоторые рекомендации по диагностике и улучшению в этих случаях. В этом руководстве описаны только те возможности, которые G1 предоставляет для повышения производительности сборщика мусора в выбранной метрике, если задано установленное приложение. В каждом конкретном случае оптимизация на уровне приложений может быть более эффективной, чем попытка настроить виртуальную машину для повышения производительности, например, за счет избежания некоторых проблемных ситуаций с помощью менее долговечных объектов в целом. В целях диагностики G1 обеспечивает полное ведение журнала. Хорошим началом является использование опции -Xlog:gc*=debug, а затем, при необходимости, уточнение выходных данных. Журнал предоставляет подробный обзор во ...

Настройка сборщика мусора Garbage-First (G1)

Изображение
В этом и последующих постах описывается, как адаптировать поведение сборщика мусора Garbage-First (G1), если оно не соответствует вашим требованиям. Общие рекомендации для G1 Общая рекомендация состоит в том, чтобы использовать G1 с настройками по умолчанию, в конечном итоге назначив ему другое время паузы и установив максимальный размер кучи Java, используя при желании -Xmx. Значения по умолчанию G1 были сбалансированы иначе, чем у других коллекторов. Целью G1 в конфигурации по умолчанию является не максимальная пропускная способность и не минимальная задержка, а обеспечение относительно небольших равномерных пауз при высокой пропускной способности. Однако механизмы G1 для постепенного восстановления пространства в куче и контроля времени паузы влекут за собой некоторые издержки как в потоках приложения, так и в эффективности восстановления пространства. Если вы предпочитаете высокую пропускную способность, то уменьшите время паузы с помощью -XX:MaxGCPauseMillis или предоставьте ...

Эргономические настройки по умолчанию для сборщика мусора G1

Изображение
В этом разделе представлен обзор наиболее важных значений по умолчанию, относящихся к G1, и их значений по умолчанию. Они дают приблизительный обзор ожидаемого поведения и использования ресурсов с использованием G1 без каких-либо дополнительных опций. Параметр и значение по умолчанию Описание -XX:MaxGCPauseMillis=200 Цель на максимальное время паузы. -XX:GCPauseTimeInterval=<ergo> Цель для максимального интервала времени паузы. По умолчанию G1 не ставит никаких целей, позволяя G1 выполнять сборку мусора вплотную в крайних случаях. -XX:ParallelGCThreads=<ergo> Максимальное количество потоков, используемых для параллельной работы во время пауз сборки мусора. Это зависит от количества доступных потоков компьютера, на котором работает виртуальная машина, следующим образом: если число потоков ЦП, доступных для процесса, меньше или равно 8, используйте его. В противном случае добавьте пять восьмых потоков больше, чем к окончательному числу поток...

Внутреннее устройство сборщика мусора Garbage-First в Java VM

Изображение
Размер кучи Java G1 соблюдает стандартные правила при изменении размера кучи Java, используя -XX:InitialHeapSize в качестве минимального размера кучи Java, -XX:MaxHeapSize в качестве максимального размера кучи Java, -XX:MinHeapFreeRatio для минимального процента свободной памяти, -XX:MaxHeapFreeRatio для определение максимального процента свободной памяти после изменения размера. Сборщик G1 учитывает изменение размера кучи Java только во время пауз Remark и Full GC. Этот процесс может освободить память или выделить ее из операционной системы. Определение размера фазы "только для молодых" G1 всегда измеряет молодое поколение в конце нормальной молодой сборки для следующей фазы мутатора. Таким образом, G1 может соответствовать целям времени паузы, которые были установлены с помощью -XX:MaxGCPauseTimeMillis и -XX:PauseTimeIntervalMillis на основе долгосрочных наблюдений фактического времени паузы. Он учитывает, сколько времени потребовалось молодым поколениям того же размера,...

Сборщик мусора Garbage-First (G1) в Java VM

Изображение
Сборщик мусора Garbage-First (G1) предназначен для многопроцессорных машин с большим объемом памяти. Он с высокой вероятностью пытается достичь целей времени паузы при сборке мусора, одновременно обеспечивая высокую пропускную способность и не требуя настройки. G1 стремится обеспечить лучший баланс между задержкой и пропускной способностью, используя текущие целевые приложения и среды, функции которых включают: Размеры кучи составляют до десятков ГБ или более, причем более 50% кучи Java занято живыми данными. Темпы размещения объектов и продвижения, которые могут значительно меняться со временем. Значительное количество фрагментации в куче. Предсказуемые целевые значения времени паузы, которые не длиннее нескольких сотен миллисекунд, избегая длительных пауз сборки мусора. G1 заменяет коллектор Concurrent Mark-Sweep (CMS). Это также сборщик по умолчанию. Коллектор G1 достигает высокой производительности и пытается достичь целей времени паузы несколькими способами. Включение G1...

Сборщик Concurrent Mark Sweep (CMS) в Java VM

Изображение
Сборщик мусора Concurrent Mark Sweep (CMS) предназначен для приложений, которые предпочитают более короткие паузы сбора мусора и которые могут предоставить ресурсы процессора сборщику мусора для совместного использования с приложением во время работы приложения. Обычно приложения, которые имеют относительно большой набор долгоживущих данных (большое старое поколение) и работают на машинах с двумя или более процессорами, обычно выигрывают от использования этого сборщика. Сборщик CMS включен с параметром командной строки -XX:+UseConcMarkSweepGC. Коллектор CMS устарел. Настоятельно рекомендуем использовать сборщик Garbage-First (G1). Производительность и структура сборщика Concurrent Mark Sweep Подобно другим доступным коллекторам, коллектор CMS работает с поколениями объектов; таким образом, встречаются как малые, так и большие сборки объектов. Сборщик CMS пытается сократить время пауз из-за больших сборок, используя отдельные потоки сборщика мусора для отслеживания достижимых объек...

Преимущественно конкурентные сборщики мусора в Java VM

Изображение
Преимущественно конкурентные сборщики выполняют часть их работы конкурентно с приложением, отсюда и их название. Java HotSpot VM включает в себя два преимущественно конкурентных сборщика: Сборщик Concurrent Mark Sweep (CMS) : этот сборщик предназначен для приложений, которые предпочитают более короткие паузы сбора мусора и могут позволить себе совместно использовать ресурсы процессора со сборщиком мусора. Сборщик мусора Garbage-First (G1) : этот сборщик серверного типа предназначен для многопроцессорных машин с большим объемом памяти. Он с высокой вероятностью отвечает целям времени сбора мусора и высокой пропускной способности. Накладные расходы преимущественно конкурентных сборщиков Преимущественно конкурентный сборщик поглощает ресурсы процессора (которые в противном случае были бы доступны приложению) в обмен на более короткое время основной паузы сбора. Наиболее заметные накладные расходы - это использование одного или нескольких процессоров во время конкурентных частей сбо...

Параллельный сборщик мусора в Java

Изображение
Параллельный сборщик (parallel collector) (также называемый сборщиком пропускной способности) является сборщиком поколений, подобным последовательному сборщику. Основное различие между последовательным и параллельным сборщиками состоит в том, что параллельный сборщик имеет несколько потоков, которые используются для ускорения сбора мусора. Параллельный сборщик включается параметром командной строки -XX:+UseParallelGC. По умолчанию при использовании этой опции как малые, так и большие сборки объектов выполняются параллельно, чтобы еще больше снизить затраты на сборку мусора. Количество потоков параллельного сборщика мусора На машине с <N> аппаратными потоками, где <N> больше 8, параллельный сборщик использует фиксированную долю <N> в качестве числа потоков сборщика мусора. Доля составляет приблизительно 5/8 для больших значений <N>. При значениях <N> ниже 8 используемое число составляет <N>. На выбранных платформах доля падает до 5/16. Конкретное...