Исходная ссылка: http://www.dubby.cn/detail.html?id=9059
1 Обзор
Аппаратные и программные требования
- Операционная система требует Windows XP или выше, как Mac OS X, так и Linux. Обратите внимание, что эти тестовые операции были выполнены в Windows 7 и не тестировались на всех платформах. Однако все должно нормально работать в OS X или Linux. Конечно, лучше, если ваша машина будет иметь более одного ядра.
- Java 7, обновление 9 или более поздняя версия.
- Последние демонстрации Java 7 и образцы Zip-файлов.
Подготовить контент
- Установите Java 7u9 или выше.
- Загрузите пример кода с официального сайта, распакуйте его и поместите, например, в папку C:\javademos.
2. Java и JVM
Предварительная версия Java
Java — это язык программирования и вычислительная платформа, впервые выпущенная компанией Sun Microsystems в 1995 году. Это базовая технология, которая поддерживает программы Java, включая инструменты общего назначения, игры и бизнес-приложения. Java работает на более чем 850 миллионах персональных компьютеров по всему миру и на миллиардах устройств по всему миру, включая мобильные и телевизионные устройства. Java состоит из ряда ключевых компонентов, которые в совокупности составляют платформу Java.
Версия среды выполнения Java
Когда вы загружаете Java, вы уже получаете среду выполнения Java (JRE). JRE состоит из виртуальной машины Java (JVM), основной библиотеки классов Java и вспомогательной библиотеки классов Java. Все три компонента должны быть установлены, если вы хотите запускать Java-программы на своем компьютере. Java 7 позволяет запускать приложения Java в операционной системе, устанавливать и запускать приложения Java из Интернета с помощью Java Web Start или запускать в браузере как встроенное веб-приложение (JavaFX).
Язык программирования Java
Java — это объектно-ориентированный язык программирования со следующими особенностями.
- Независимость от платформы — приложения Java компилируются в байт-код, хранятся в файлах классов, а затем загружаются JVM. Поскольку приложения Java запускаются в JVM, а не непосредственно в операционной системе, они могут работать в различных операционных системах. (Переводчик: То есть написать один раз, запустить везде, JVM помогает мне сделать совместимость с платформой, конечно, она не может быть действительно независимой от платформы)
- Объектно-ориентированный — Java поглощает многие функции C и C++ и делает некоторые оптимизации.
- Автоматическая сборка мусора — Java автоматически выделяет и освобождает память без нагрузки на программиста. (Переводчик: Но бремя понимания механизма GC больше, иначе вы не будете читать эту статью)
- Богатая стандартная библиотека — в Java есть множество предварительно разработанных классов, которые мы можем использовать напрямую, например: ввод и вывод, сеть, дата и т. д.
JDK
Java Development Kit (JDK) — это набор инструментов, необходимых для разработки Java-приложений. С помощью JDK вы можете компилировать свои программы, написанные на Java, и запускать их. В дополнение к этому JDK также предоставляет инструменты для упаковки и распространения приложений.
JDK и JRE совместно используют интерфейс программирования приложений Java (Java API). Java API — это предварительно упакованная библиотека классов, которую разработчики могут использовать напрямую. Java API упрощает разработку для разработчиков, например: обработку строк, обработку времени, работу в сети, наборы различных структур данных (например, списки, карты, стеки и очереди).
JVM
Виртуальная машина Java (JVM) — это абстрактный компьютер. JVM — это программа, похожая на компьютер, который может выполнять программу, написанную для JVM. Таким образом, программа на Java записывается с тем же набором интерфейсов и библиотек. Для каждой реализации JVM конкретной операционной системы инструкция программирования Java преобразуется в инструкции и команды, выполняемые в локальной операционной системе. Таким образом, программа на Java реализует независимость от платформы.
Компания Sun завершила реализацию первого прототипа виртуальной машины Java, имитирующего набор инструкций виртуальной машины Java в программном обеспечении, используемом на портативных устройствах, таких как современные персональные цифровые помощники. Текущая виртуальная машина Oracle реализует виртуальную машину Java на мобильных, настольных и серверных устройствах. Но виртуальная машина Java не несет ответственности за какую-либо конкретную технологию реализации, аппаратное обеспечение хоста или операционную систему хоста. У него нет встроенной интерпретации (только спецификация), вы также можете сделать это, скомпилировав его набор инструкций для кремниевого процессора. Его также можно реализовать в микрокоде или непосредственно в кремнии.
Виртуальная машина Java ничего не знает о языке программирования Java и знает только определенный двоичный формат, то есть класс формата файла class. Файлы классов содержат инструкции виртуальной машины Java (или байт-коды), таблицы символов и другую вспомогательную информацию.
В целях безопасности виртуальная машина Java накладывает строгие синтаксические и структурные ограничения на код в файлах классов. Однако виртуальная машина Java может содержать любой язык, функциональность которого может быть представлена допустимым файлом класса. Из-за этого разработчики многих других языков, чтобы насладиться обходом, обеспечиваемым JVM, могут скомпилировать свой собственный язык в файл класса и передать его JVM для выполнения.
Изучите архитектуру JVM
Архитектура точки доступа
HotSpot JVM имеет инфраструктуру, которая поддерживает мощные функции и возможности, а также возможность достижения высокой производительности и значительной масштабируемости. Например, JIT-компилятор HotSpot JVM генерирует динамические оптимизации. Другими словами, они принимают решения по оптимизации во время работы Java-приложения и генерируют высокопроизводительные собственные машинные инструкции для базовой архитектуры системы. Кроме того, благодаря зрелой разработке и непрерывному проектированию среды выполнения и многопоточного сборщика мусора HotSpot JVM обладает высокой масштабируемостью даже на самых больших доступных компьютерных системах.
Основные компоненты JVM включают загрузчик классов, область данных времени выполнения и механизм выполнения.
Ключевые компоненты точки доступа
На следующей диаграмме показаны ключевые компоненты JVM, связанные с производительностью.
При настройке производительности JVM имеет три компонента, на которых следует сосредоточиться. Куча — это место, где хранятся данные вашего объекта. Эта область управляется сборщиком мусора, выбранным при запуске. Большинство параметров настройки относятся к размеру кучи и выбору наиболее подходящего сборщика мусора для вашей ситуации. Компилятор JIT также оказывает большое влияние на производительность, но редко требует настройки с более новыми версиями JVM.
Основы производительности
Как правило, при настройке приложения Java основное внимание уделяется одной из двух основных целей: скорости отклика или пропускной способности. Мы будем рассматривать эти концепции по мере прохождения урока.
Ответная реакция
Отзывчивость относится к тому, насколько быстро приложение или система может ответить на запрос. Например:
- Насколько быстро настольное приложение реагирует на события пользовательского интерфейса (касание, пролистывание и т. д.).
- Скорость, с которой веб-сайт возвращает страницы.
- Скорость, с которой возвращаются результаты запроса к базе данных.
Для приложения, ориентированного на отзывчивость, длительные паузы неприемлемы. Цель оптимизации обычно состоит в том, чтобы ускорить ответ.
пропускная способность
Пропускная способность связана с объемом работы, которую приложение или система может выполнить за заданный промежуток времени. Например:
- Количество дел, сделанных в данный момент времени.
- Количество заданий, которое пакет может выполнить за час.
- Количество запросов, которые база данных может выполнить за час.
Длинные паузы приемлемы для приложений, чувствительных к пропускной способности. Потому что основное внимание уделяется производительности в течение более длительного периода времени, а не максимально быстрому закрытию запроса.
3. Коллектор G1
Коллектор G1 (First Collector First Collector) - это сценарий на стороне сервера, многопроцессор и большой памяти. Коллектор G1 может быть оченьВысокая вероятностьсоответствовать ожидаемому времени паузы при достижении высокой пропускной способности. Сборщик G1 поддерживается, начиная с JDK 7, обновление 4. Коллектор G1 предназначен в первую очередь для следующих применений:
- Может работать одновременно с потоками приложений, такими как сборщик CMS.
- Полная дефрагментация свободной памяти за короткое время паузы.
- Требуется более предсказуемая продолжительность паузы GC.
- Не нужно жертвовать слишком большой пропускной способностью.
- Нет необходимости в большей куче Java.
G1 планирует долговременную замену коллекторов CONDURDE CONSERNING TRADEMARK (CMS). Сравните G1 и CMS, есть некоторые различия, которые делают G1 лучшее решение. Разница в G1 - это реализация алгоритма сжатия. G1 Достаточно сжатое пространство, чтобы избежать распределения с использованием мелкозернистых свободных списков, но в зависимости от площади. Это значительно упрощает реализацию коллектора и большинство из них устраняет потенциальные проблемы обломки. Кроме того, G1 обеспечивает более предсказуемую паузу сбора мусора, чем CMS Collectors, и позволяет пользователям указывать желаемую цель паузы.
Обзор G1
Предыдущие сборщики мусора (последовательные, параллельные, CMS) разделят кучу на три области: молодое поколение, старое поколение и постоянное поколение.
Все объекты умирают в одном из блоков.
Сборщик G1, с другой стороны, разделяет память кучи другим способом.
Куча разбивается на набор областей кучи одинакового размера, каждая из которых представляет собой непрерывный диапазон виртуальной памяти. Каждой области назначается Эдем, выживший или старый, но они не имеют фиксированного размера. Это обеспечивает большую гибкость в использовании памяти.
G1 работает как сборщик CMS при сборке мусора. G1 выполняет параллельную фазу глобальной маркировки, чтобы определить живучесть объектов в куче. После завершения фазы маркировки G1 знает, какие области в основном пусты. Сначала он собирает эти области, что часто дает много свободного места. Вот почему этот метод сборки мусора называется первым мусором. Как следует из названия, G1 концентрирует свою деятельность по сбору и уплотнению в областях кучи, которые могут быть заполнены перерабатываемыми объектами, то есть мусором. G1 использует модель прогнозирования паузы для достижения заданного пользователем целевого времени паузы и выбирает количество регионов для сбора на основе указанного целевого времени паузы.
Область, созревшая для сбора, отмеченная G1, представляет собой мусор, который необходимо собрать. G1 копирует объекты из одной или нескольких областей кучи в одну область кучи, уплотняя и освобождая память в процессе. Эта эвакуация выполняется параллельно на нескольких процессорах, чтобы сократить время паузы и повысить производительность. Таким образом, для каждой сборки мусора G1 постоянно уменьшает фрагментацию, работая в пределах заданного пользователем времени паузы. Это выходит за рамки возможностей предыдущих двух методов. Сборщик мусора CMS (Concurrent Mark Scan) не выполняет уплотнение. Сборка мусора ParallelOld выполняет только полное уплотнение кучи, что приводит к значительной паузе.
Обратите внимание, что G1 не является коллектором в реальном времени. Он достигает установленного целевого тайм-аута с высокой вероятностью, но не с абсолютной уверенностью. Основываясь на ранее собранных данных, G1 оценивает, сколько областей можно собрать в течение заданного пользователем целевого времени. Таким образом, сборщик имеет довольно точную модель стоимости области сбора и использует эту модель, чтобы определить, какие и сколько областей собирать, не выходя за рамки целевого времени задержки.
Примечание. G1 имеет параллельные (выполнение с потоками приложений, например, уточнение, маркировка, развертка) и параллельные (многопоточные, например, остановка мира) этапы. Полный сборщик мусора по-прежнему является однопоточным, но при правильной настройке приложения смогут избежать полного сбора мусора.
Объем памяти G1
Если вы переходите с ParallelOldGC или CMS на G1, вы обнаружите, что у вас больше памяти. В основном это связано со «статистическими» структурами данных, такими как запомненные наборы и наборы коллекций.
Remembered SetsИли RSets отслеживает, где применяется объект. Каждая область кучи имеет TSet. RSet можно распараллелить независимо от ссылки на объект области телефона. Объем памяти для RSets составляет менее 5%.
Collection SetsИли CSets будут собраны в GC. Все живые объекты будут эвакуированы (скопированы/перемещены). CSets могут быть Эдемом, выжившим и старым поколением. CSets используют менее 1% памяти.
Сценарии, в которых рекомендуется G1
Первая цель G1 — предоставить решение для пользователей, работающих с приложениями, которым необходимо гарантировать ограниченную задержку GC и которые представляют собой большие кучи. Это означает размер кучи около 6 ГБ или более со стабильным и предсказуемым временем паузы менее 0,5 секунды.
Приложения, которые в настоящее время работают с CMS или сборщиком мусора ParallelOldGC, выиграют от перехода на G1, если приложение имеет одну или несколько из следующих характеристик.
- Полный GC длится слишком долго или слишком часто.
- Темпы размещения объектов или темпы продвижения значительно различаются.
- Не нужны длинные паузы GC (более 0,5–1 секунды)
Примечание. Если вы используете CMS или ParallelOldGC и ваше приложение не сталкивалось с длительными паузами GC, вы можете не менять его. Даже если вы не используете сборщик G1, вы все равно можете использовать последнюю версию JDK.
4. Проверьте сборщик CMS
Обзор Generational GC и CMS
Сборщик Concurrent Mark-Sweep (CMS) (также известный как параллельный сборщик с малой паузой) собирает постоянное поколение. Он пытается свести к минимуму паузы из-за сборки мусора, выполняя большую часть работы по сборке мусора одновременно с потоком приложения. Как правило, параллельные сборщики с низкой паузой не копируют и не сжимают живые объекты. Живые объекты не перемещаются после завершения сборки мусора. Если фрагментация является проблемой, выделите кучу большего размера.
Примечание. Сборщик CMS молодого поколения использует тот же алгоритм, что и параллельный сборщик.
Фаза сбора CMS
Когда CMS собирает старую генерацию, она выполняет следующие шаги:
сцена | описывать |
---|---|
1. Метка инициализации (Остановить мир) | Объекты в старом поколении «помечаются» как достижимые, включая объекты, которые могут быть доступны в молодом поколении. Время паузы, как правило, короткое. |
2. Параллельная маркировка | Когда поток приложения выполняется, он одновременно проходит объекты старого поколения, чтобы создать граф доступных объектов. Этот анализ достижимости выполняется на этапах 2, 3 и 5, и отсканированные объекты немедленно помечаются как живые. |
3. Остановить мир | найтиФаза одновременной маркировкиПропущенные объекты, то есть объекты, которые затем обновляются потоком приложения Java после того, как сборщик завершил отслеживание объекта. |
4. Параллельный клиринг | Собирайте объекты, которые были отмечены как недоступные на этапе маркировки. Мертвые объекты добавляются в список свободных для последующего назначения. В этот момент мертвые объекты могут быть объединены. Обратите внимание, что живые объекты не перемещаются. |
5. Сброс | Очистите статистику, собранную на этот раз, для подготовки к следующему сбору. |
Просмотрите шаги по сбору мусора
1. Структура кучи CMS
Куча разбита на 3 части.
Новое поколение разделено на Эдем и два выживших региона. Старость — это непрерывное пространство. В обычных условиях дефрагментация объекта (переводчик: дефрагментация памяти) не выполняется, если не выполняется полная сборка мусора.
2. Как работает Young GC
Молодое поколение отмечено зеленым цветом, а старшее — синим. Если ваше приложение работало какое-то время, память вашей виртуальной машины должна выглядеть так. В пожилом возрасте память очень фрагментарна.
При использовании CMS объекты старого поколения будут со временем утилизированы. Опять же, живые объекты не будут сортироваться, пока не будет выполнена полная сборка мусора.
3. Сбор нового поколения
Живой объект будет скопирован из зоны Эдема и Сувивора в другую зону СУВИВОР. Если возраст объекта достиг порогового значения, он будет переведен в старческий.
4. После Янга GC
После ГК Юнга область Эдема и один из выживших опустеют.
На рисунке темно-синим цветом обозначен объект, который только что был переведен от молодого поколения к старшему поколению. Зеленые объекты в новом поколении — это объекты, которые еще не достигли условий акции.
5. Старая коллекция CMS
«Остановить мир» состоит из двух этапов: первоначальная пометка и повторная пометка. Когда занятость пространства объекта старости достигает порогового значения, CMS срабатывает.
(1) В начальной маркировке будет короткая пауза, чтобы отметить достижимые объекты. (2) Фаза параллельной маркировки заключается в одновременной маркировке живых объектов во время выполнения приложения. Затем выполняется (3) перемаркировка, чтобы найти живые объекты, которые были пропущены на этапе (2).
6. коллекция старых - Concurrent Clear
Объекты, не отмеченные на предыдущих этапах, освобождаются, а память не очищается.
Примечание: Неотмеченный объект == мертвый объект
7. Сбор по старости - после очистки
После сбора фазы (4) вы можете увидеть, что многие объекты освобождены. Вы также можете заметить, что фрагментация памяти все еще существует. (Переводчик: Терпеть не могу, это предложение встречалось десятки тысяч раз)
Затем CMS завершает (5) работу по сбросу и ожидает поступления следующего GC.
5. Шаг за шагом к G1
Коллектор G1 выделяет в память кучи иначе, чем раньше.
1. Структура кучи G1
Куча памяти — это область памяти, разделенная на множество областей фиксированного размера.
Размер каждого региона определяется при запуске JVM. JVM обычно разбивается на 2000 регионов, размер каждого региона 1 ~ 32Mb.
2. Распределение памяти G1
Каждая небольшая область представляет собой Эдем, выживший или старый.
Цвета на картинке показывают, что представляет каждая область. При сборе живые объекты перемещаются из одной области в другую. Каждый регион можно собирать параллельно (Остановить мир) или не параллельно.
Каждая небольшая область может представлять Эдем, выживший или старый. В дополнение к этому существует четвертый тип области, используемой для хранения крупных предметов. Как правило, объекты, размер которых превышает 50% одной области, будут отнесены к четвертой области. Этот четвертый тип региона представляет собой набор последовательных регионов. Четвертый тип области — это то, что мы называем нераспределенной областью.
Примечание. На момент написания этой статьи коллекция больших объектов не была оптимизирована, поэтому рекомендуется по возможности избегать выделения таких больших объектов.
3. Молодое поколение в G1
Память кучи разбита на 2000 небольших областей, минимальный размер которых составляет 1 МБ, а максимальный размер — 32 МБ. Синий представляет старое поколение, а зеленый представляет новое поколение.
Примечание: нет необходимости размещать новое поколение и следующее поколение в непрерывной памяти, как предыдущие сборщики.В G1 новое поколение и старое поколение могут быть рассредоточены.
4. Молодой GC в G1
Живые объекты переносятся (копируются/перемещаются) в другой или несколько выживших регионов. Если возраст достигает порогового значения, он будет отнесен к области Старый.
Этот процесс называется «Остановить мир». Этот процесс будет учитывать много информации, такой как размер Эдема, размер выжившего и время паузы этой коллекции и т. д. Это нужно для подготовки к следующей коллекции.
Таким образом, легко изменить размер каждой области.
5. После Янга GC G1
Живые объекты перемещаются в другие выжившие или старые области.
Подводя итоги, характеристики молодого GC G1:
- Куча разбита на регионы.
- Новое поколение состоит из некоторых прерывистых областей. Это позволяет легко увеличивать или уменьшать численность молодого поколения.
- Молодой GC остановит мир.
- Young GC является многопоточным и параллельным.
- Живые объекты будут скопированы и перемещены в выживший или в старую область.
Коллекция старости G1
Как и CMS, G1 разработан как сборщик мусора с низкой паузой. В приведенной ниже таблице описан этап сбора данных старого поколения для G1.
Этап сбора G1 — этап параллельного цикла маркировки
Шаги сбора старого поколения для G1 следующие, обратите внимание, что некоторые из этих шагов являются частью Young GC.
сцена | описывать |
---|---|
1. Остановить мир | Это остановит мир. Он будет ездить на Young GC и отмечать объекты в старом поколении, на которые может ссылаться молодое поколение (корневой регион/корневые регионы). |
2. Сканирование корневой области | Просканируйте молодое поколение, чтобы найти, на какие объекты в старом поколении ссылаются объекты в молодом поколении. Эта фаза не прерывает выполнение приложения. Эта фаза должна быть завершена до того, как произойдет Young GC. |
3. Параллельная маркировка | Найдите живые объекты во всей куче. Это выполняется одновременно с приложением. Однако этот этап может быть прерван Young GC. |
4. Остановить мир | Полная маркировка живых объектов. Используйте алгоритм SATB (снимок в начале) (этот алгоритм намного быстрее, чем алгоритм, используемый CMS) |
5. Очистить (Остановить мир также одновременно) | 1. Подсчитать живые объекты и полностью свободные области (Остановить мир) 2. Очистить RSets (Остановить мир) 3. Сбросить свободную область и переработать ее в Список свободных (параллелизм) |
*, Копировать (Остановить мир) | Остановите мир, скопируйте и переместите живой объект в новую неиспользуемую область. Если эвакуируется только молодое поколение, то бревноGC pause (young) , если эвакуировано и молодое поколение, и старое поколение, журнал записывается какGC Pause (mixed)
|
Теперь, когда у нас есть приблизительное представление об определении каждого этапа, давайте подробнее рассмотрим, что делает каждый шаг.
6. Начальная фаза оценки
Первоначальная оценка выполняется вместе с поездкой Young GC.Если вы посмотрите на журнал GC, этоGC pause (young)(inital-mark)
.
7. Параллельная фаза оценки
Если естьпустая область(отмечены «Х», то есть предметы внутри мертвы) найдены, то они удаляются непосредственно на этапе перемаркировки. Аналогично, эта информация также будет учитываться и использоваться для оптимизации следующего GC.
8. Фаза перемаркировки
Пустые участки будут напрямую удалены для переработки. И рассчитать живучесть объектов во всех регионах.
9. Фаза копирования / очистки
Сборщик G1 выберет область с наименьшей активностью объектов для сбора. Молодое поколение и старое поколение перерабатываются одновременно. В этом случае журнал GCGC pause (mixed)
. Таким образом перерабатываются молодые и старые коллеги.
10. После этапа копирования/очистки
После того, как выбранная область была переработана и сжата, она становится темно-синей и темно-зеленой на изображении.
Подводя итоги ГХ старого поколения
Характеристики ГХ старого поколения G1:
- Параллельная фаза маркировки
- Когда приложение работает, активность каждого региона рассчитывается одновременно.
- Определите, какие области наиболее достойны переработки на основе активности.
- Нет фазы очистки, подобной CMS.
- Этап замечаний
- Используйте алгоритм Snapshot-at-the-Beginning (SATB), который более эффективен, чем алгоритм CMS.
- Полностью пустые участки перерабатываются.
- Копировать / четкую фазу
- Молодое поколение и старое поколение перерабатываются одновременно.
- Отбор старшего поколения определяется по активности.
6. Параметры командной строки и рекомендации
основная командная строка
Чтобы использовать сборщик G1, нам нужно использовать-XX:+UseG1GC
Здесь мы используем демонстрацию для демонстрации (сначала вам нужно войти в каталог с демонстрациейdemo/jfc/Java2D
Вниз),
java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar Java2Demo.jar
Введение основных параметров
-XX:+UseG1GC- Скажите JVM использовать сборщик G1.-XX:MaxGCPauseMillis=200- Установите максимальное время паузы. Это мягкая цель, то есть JVM сделает все возможное, чтобы достичь вашей цели. Поэтому иногда он может не соответствовать вашим требованиям. Значение по умолчанию — 200 мс.XX:InitiatingHeapOccupancyPercent=45—— Когда общий коэффициент использования кучи достигает этого значения, запускается GC. Это коэффициент занятости всей кучи, а не коэффициент занятости определенного поколения. 0 означает, что сборщик мусора выполнялся в цикле, а значение по умолчанию — 45.
лучшая реализация
Вот несколько рекомендаций по использованию G1.
Не устанавливайте способности молодого поколения
если вы используете-Xmn
Чтобы указать размер нового поколения, вмешайтесь в поведение G1 (Переводчик: G1 будет очень зол, последствия очень серьезные).
- G1 не будет учитывать ожидаемое время паузы, то есть эта опция будет отключена.
-XX:MaxGCPauseMillis
. - G1 не сможет динамически расширять и сжимать ваше молодое поколение, потому что оно уже задано.
Используйте время отклика в качестве критерия
Не используйте среднее время отклика для установкиXX:MaxGCPauseMillis=<N>
, попробуйте установить его со значением 90 % или выше ожидаемого времени отклика. То есть 90% времени ответа на запрос пользователя (клиент/?) не превысит заданное целевое значение. Потому что это значение является только целевым значением и не может быть точно гарантировано.
Передача не удалась?
Сбой продвижения происходит, если области кучи JVM недостаточно во время GC выживших или продвигаемых объектов. Память кучи не может продолжать расширяться, так как достигнуто максимальное значение. можно использовать-XX:+PrintGCDetails
, так что в случае сбоя передачи он напечатаетto-space overflow. Эта операция дорогая!
- GC все еще должен продолжаться, поэтому место должно быть освобождено.
- Объекты, которые не удалось скопировать, должны быть размещены в подходящем месте.
- Все обновленные наборы RSets в регионе CSet должны быть созданы заново.
- Все эти эксплуатационные расходы значительны.
Как избежать сбоя передачи?
- Увеличьте память кучи.
- увеличивать
-XX:G1ReservePercent=n
, по умолчанию 10. - G1 использует зарезервированную память, создавая ложный предел памяти, который используется при сбое памяти. (Переводчик: Оставайтесь на линии во всем, увидимся в будущем)
- увеличивать
- Выполните GC раньше.
- использовать
-XX:ConcGCThreads=n
Чтобы увеличить поток выполнения GC.
Полные параметры командной строки G1
Полные параметры командной строки для G1 приведены ниже, имейте в виду приведенные выше рекомендации при их использовании.
Параметры и значения по умолчанию | описывать |
---|---|
-XX:+UseG1GC | Используйте коллектор G1 |
-XX:MaxGCPauseMillis=n | Установите ожидаемое время паузы, помните, что это всего лишь мягкая цель, JVM попытается ее достичь. |
-XX:InitiatingHeapOccupancyPercent=n | Процент памяти кучи, используемый при запуске параллельных циклов сборки мусора. Сборщики мусора, такие как G1, используют это значение для запуска параллельных циклов сборки мусора на основе использования всей кучи, а не только коэффициента использования памяти поколения. Значение 0 означает " всегда выполнять «циклы GC». Значение по умолчанию — 45. |
-XX:NewRatio=n | Соотношение размера нового поколения и старого поколения (новое/старое), по умолчанию 2 |
-XX:SurvivorRatio=n | Соотношение eden/suvivor, по умолчанию 8 |
-XX:MaxTenuringThreshold=n | Возраст, в котором продвигается объект, по умолчанию 15 лет. |
-XX:ParallelGCThreads=n | Количество потоков, используемых параллельным этапом сборщика. Значение по умолчанию зависит от платформы, на которой работает JVM. |
-XX:ConcGCThreads=n | Устанавливает количество потоков для сборщика. Значение по умолчанию зависит от платформы, на которой работает JVM. |
-XX:G1ReservePercent=n | Установите G1 для резервирования памяти, чтобы предотвратить сбой передачи |
-XX:G1HeapRegionSize=n | Коллектор G1 делит динамическую память на множество небольших областей одинакового размера. Эта опция предназначена для установки размера каждой области.Значение по умолчанию рассчитывается на основе общего объема кучи. Диапазон 1 Мб ~ 32 Мб |