На бумаге в конце концов я чувствую себя мелким, я ничего не знаю об этом вопросе
Компания, в которой я работаю, в принципе не имеет возможности настраивать параметры JVM, но если вы не испытываете некоторые вещи самостоятельно, сколько бы теоретических знаний вы ни видели, это можно рассматривать только как бумажку. , вы еще не умеете их анализировать. . Так что просто создайте себе несколько проблем, а затем посмотрите на феномен, используйте знания, которые вы узнали, чтобы строить предположения заранее, и посмотрите, совпадает ли этот феномен с вашими собственными предположениями. Это не только закрепит полученные знания, но и потренирует вашу способность решать проблемы (хотя проблемы создаются вами самими).
На самом деле, до написания этой статьи я видел хорошие времена, когда JVM настраивала этот контент, будь то книга или блог, но большинство чувствует после прочтения понимание, но когда они действительно думают о своих собственных манипуляциях, ничего не будет, кроме как после их собственного будущего. Моделирование может быть найдено снова, прежде чем знание связано с образованием поверхности, глубокое чувство немного понимания. Подчеркните здесьНадеюсь, что после прочтения вы сможете сами смоделировать это на машине, использовать разные параметры, а потом угадать результат и убедиться в этом самостоятельно
Подготовка инструмента
Если рабочий хочет хорошо работать, он должен сначала заточить свои инструменты. Прежде чем анализировать JVM, нам нужно подготовить инструменты, один из которых — инструмент визуальной сборки мусора, а другой — инструмент измерения напряжения.
Установка GcViews
- будет
GcViews
Код скачивается с Gitгитхаб-адрес - Запустить в корневом каталоге проекта
mvn clean install
- А затем найден в корневом каталоге сгенерировано
target
папка, в которой вы можете найтиgcviewer-1.37-SNAPSHOT.jar
документ
Установка JMeter
Apache JMeter — это инструмент для стресс-тестирования с открытым исходным кодом. JMeter разработан на основе Java. JMeter используется не только для веб-нагрузочного тестирования, но также использует открытый исходный код для стресс-тестирования на основе программного обеспечения доступа. Он может выполнять стресс-тестирование статических файлов, баз данных , FTP, SSH и т. д. проведите стресс-тест
- Скачать JMeter,ссылка для скачивания
- Разархивируйте, мой адрес
/Users/hupengfei/apache-jmeter-5.1.1
- Откройте терминал и перейдите к его
bin
ниже каталога - Выполнение заказа
sh jmeter
Тогда я не буду вдаваться в подробности настройки параметров здесь, вы можете прочитать эту статью.Стресс-тест JMeter Http [Иллюстрация]
Введение в теорию
Для настройки JVM это в основном оптимизация сборки мусора JVM. Вообще говоря, оптимизация требуется, потому что есть проблемы. Поэтому для JVM GC, если вы наблюдаете за производительностью вашего процесса обслуживания приложенияВысокая загрузка ЦП, и обнаружил в журнале GC, что число GC частое, а время паузы GC большое, что указывает на необходимость оптимизации GC.
В процессе настройки GC нам не нужно знать некоторые принципы GC, главное уметь пользоваться различными инструментами мониторинга и анализа, иметь реальную боеспособность настройки GC. В настоящее время существует два сборщика мусора с самым высоким коэффициентом использования: один — CMS, а другой — G1. Начиная с Java9, G1 используется как сборщик мусора по умолчанию, и цель G1 — постепенно заменить CMS. Итак, позвольте мне кратко представить разницу между этими двумя коллекторами.
можно использовать команду
java -XX:+PrintCommandLineFlags -version
Просмотрите некоторые параметры вывода по умолчанию в командной строке. Сборщик мусора по умолчанию для каждой версии можно посмотреть здесь
- Java 7: Parallel GC
- Java 8: Parallel GC
- Java 9: G1 GC
- Java 10: G1 GC
Сборщик CMS
Сборщик CMS делит кучу Java намолодое поколениеистарое поколение(В Java8 постоянное поколение было удалено и превращено в метапространство, а метапространство хранится непосредственно в памяти, а не в JVM). В основном это связано с тем, что исследования показали, что более 90% объектов будут собраны на первом GC, но некоторые объекты сохранятся в течение длительного времени.
В CMS молодое поколение также разделено на две части, одна частьВыживший (выживший)иЭдемское пространство (Эдем). Новые объекты всегда создаются в пространстве Эдема, и как только объект переживает сборку мусора, он перемещается в оставшееся пространство. Когда объект переживает несколько сборок мусора, он перемещается в старое поколение. Целью этого является использование разных алгоритмов сборки мусора в молодом и старом поколениях для достижения более высокой эффективности сборки. Например, поскольку объекты молодого поколения имеют более короткое время выживания и меньше объектов остается в сборке мусора,алгоритм копирования-сортировки. Однако в пожилом возрасте время выживания объекта больше, и может быть меньше объектов, собранных в одной сборке мусора, и больше объектов, оставленных позади.алгоритм маркировки-сопоставления.
коллектор G1
По сравнению с CMS G1 имеет две основные характеристики.
- G1 может выполнять большую часть работы GC одновременно и не будет «Остановить мир» в течение этого периода.
- G1 использует несмежное пространство, что позволяет G1 эффективно обрабатывать очень большие кучи, а G1 может собирать как молодые, так и старые поколения. Вместо разделения кучи Java на три пространства (Eden, Survivor и Old) G1 разделил кучу на множество очень маленьких областей. Размер этих регионов фиксирован (по умолчанию каждый регион имеет размер 2 МБ). Каждой области отведено место.
U на рисунке представляет собой нераспределенную область. G1 разбивает кучу на небольшие области. Одно из самых больших преимуществ заключается в том, что он может выполнять сборку мусора в локальных областях вместо того, чтобы каждый раз очищать всю область, например, молодое поколение и старое поколение. , Время паузы для переработки будет короче. Процесс сбора примерно такой
- удалить все уцелевшие объекты иззона сбораскопировать внераспределенная область. Например, собранная область - это пространство Эдема, скопируйте уцелевшие объекты в Эдеме в нераспределенную область, и эта нераспределенная область станет пространством выживших.В идеале, если область состоит из мусора (это означает, что выживший объект не имеет ), вы можете прямо объявить область как «нераспределенную».
- Чтобы оптимизировать время сбора, G1 всегда отдает приоритет областям с наибольшим количеством мусора, сводя к минимуму объем работы, необходимой для последующего выделения и освобождения места в куче. Отсюда и название коллектора G1 -Garbage-First
Практическая тренировка
Я использую версию Java8, а используемый сборщик мусора Java - CMS.
Далее я буду использовать практические примеры для борьбы с частыми сборщиками мусора в программах Java из-за небольшой настройки молодого поколения Мы будем использовать инструменты анализа журнала сборщика мусора для наблюдения за действиями сборщика мусора и выявления проблем.
Во-первых, мы строим программу Springboot, как наш объект настройки. код показывает, как показано ниже:
1@RestController
2@Slf4j
3public class GcTestController {
4
5 private List<Greeting> objListCache = new ArrayList<>();
6
7 @RequestMapping("/greeting")
8 public Greeting greeting() {
9 Greeting greeting = new Greeting();
10 if (objListCache.size() >= 100000) {
11 log.info("clean the List!!!!!!!!!!");
12 objListCache.clear();
13 } else {
14 objListCache.add(greeting);
15 }
16 return greeting;
17 }
18}
19
20@Data
21class Greeting {
22 private String message1;
23 private String message2;
24 private String message3;
25 private String message4;
26 private String message5;
27 private String message6;
28 private String message7;
29 private String message8;
30 private String message9;
31 private String message10;
32 private String message11;
33 private String message12;
34 private String message13;
35 private String message14;
36 private String message15;
37 private String message16;
38 private String message17;
39 private String message18;
40 private String message19;
41 private String message20;
42}
Приведенный выше код создает пул объектов, который будет очищен один раз, когда количество объектов в пуле объектов достигнет 100 000, который используется для имитации объектов старого возраста. Здесь вы можете использовать мою последнюю статьюНе взорвет ли система размещение миллионов данных в памяти?Примерно подсчитайте, сколько памяти занимают объекты 10W в памяти. Вот я только что сказал 100000Greeting
Объект занимает около 10 м площади.
Итак, ниже я задаю параметры запуска в Idea, параметры следующие
1-Xmx52m -Xmn9m -Xss256k -XX:+PrintGC -XX:+UseConcMarkSweepGC -Xloggc:/Users/hupengfei/Downloads/gclog/gc.log
Начальный размер кучи, который я устанавливаю для программы, составляет 52 МБ, размер молодого поколения составляет 9 МБ, а отношение по умолчанию между областью Eden и районом выживании в молодом поколении - 4: 1, поэтому размер зоны Эдена в Молодое поколение составляет около 7,2 МБ. Цель состоит в том, чтобы все могли видеть, что объекты, которые не переработаны в районе Эдена, войдут в старость, и если область Эдена полна, молодой GC будет происходить.
Затем мы используем инструмент стресс-тестирования JMeter, чтобы отправить тестовый запрос в программу.Обратите внимание, что время доступа, которое я установил здесь, составляет 10 минут, а затем поток обращается к нему без перерыва.
Через десять минут мы можем использовать инструмент GCViewer, чтобы открыть журнал GC, и мы видим следующую картину.
- Синяя линия: указывает размер использованной кучи. Мы видим, что ее цикл колеблется вверх и вниз. Это потому, что наш пул объектов не будет опустошен, пока он не расширится до 100 000.
- Зеленая линия внизу: Указывает, что происходит активность GC Мы видим, что после увеличения использования кучи будет запускаться частый GC
- Черная линия посередине: указывает на Full GC, мы видим, что синяя линия опускается вместе с Full GC, что означает, что Full GC восстанавливает объекты старости
На основании вышеприведенного рисунка можно сделать вывод, что набор молодого поколения недостаточен, почему мы приходим к такому выводу?
- Активность GC частая: вы можете увидеть более интенсивную зеленую линию
- Память кучи Java может быть восстановлена после того, как произойдет полный сборщик мусора, что указывает на то, что это не утечка памяти.
На дисплее в левой части GCView мы видим, что общий сборщик мусора выполнялся 1622 раза, из которых один раз выполнялся полный сборщик мусора.
Далее, когда общий размер кучи останется прежним, просто подгоняем размер молодой генерации до 16Мб, а потом смотрим на картинку
Мы видим, что хоть и есть еще один Full GC, но GC молодого поколения встречается не так часто. А совокупное время паузы GC составляет всего 1,48 секунды.
Что, если мы хотим продолжить оптимизацию? Это должно продолжать расширять общий размер кучи памяти.Далее, мы устанавливаем кучу на 200 МБ и молодое поколение на 80 МБ.Давайте посмотрим на эффект.
Видно, что при этом полного ГК нет, а в молодом поколении встречается меньше ГК.
Стратегия настройки
Для сборщика CMS мы хотим установить разумный размер младшего поколения и старшего поколения, вы можете спросить, есть ли для этого фиксированная формула? На самом деле, я не был здесь, процесс настройки является итеративным процессом, поэтому значение JVM по умолчанию, затем измеряемое давление анализирует журналы GC. ГК наблюдался при восстановлении в различных ситуациях.
Если мы видим, что Minor GC происходит часто, а эффективность частого GC невысока, значит, наши объекты не так быстро регенерируются, в это время мы можем соответствующим образом увеличить размер молодого поколения и наблюдать.
Если мы видим, что использование памяти в старом поколении велико, что приводит к частым полным сборкам мусора. Это обычно делится на два случая
- Если использование памяти старого поколения не уменьшается каждый раз при полной сборке мусора, это может быть утечка памяти, и код необходимо проверить.
- Если использование памяти уменьшается после полного GC, это означает, что это не утечка памяти, вы можете рассмотреть возможность настройки старости.
кодовый адрес
Тестовый код выложен на GitHubGitHub.com/Г-н Моду…, и поместите в него журнал GC, который я тестировал много раз.Если вы не хотите тестировать его самостоятельно, вы можете скачать журнал GC и увидеть картину для себя.
Писательские навыки у автора пока неглубокие, если что не так, укажите великодушно, буду признателен
Суммировать
Знания на бумаге, знания в книгах или в Интернете — это, в конечном счете, обобщение собственного опыта автора. Должна быть авторская идея. Однако это может не совпадать с реальной ситуацией, а главное, точную информацию, которая должна быть передана в предложении, может получить далеко не каждый, прочитавший текстовое описание. Если есть именно этот опыт, он будет резонировать.
Я считаю, что люди читают с целью обучения, а обучение нужно именно для собственного роста. Так что центр обучения — люди, а не книги. Суть обучения в том, чтобы совместить то, чему вы научились, с самим собой. Если вы не соединитесь с собой, вы не сможете резонировать со знанием книги, вам будет трудно глубоко понять истину книги, и, естественно, будет трудно запомнить эту истину.
Большая часть знаний в книге — это собственное понимание и восприятие автора, поэтому сложно поставить такую сцену, которая резонирует с автором.воспроизводитьВ сознании читателей пусть резонирует и автор, чтобы «то, что получится на бумаге, окажется поверхностным». Только деконструируя знания в книге и соединяясь с собой, «делать это, не зная об этом», тогда, когда мы изучаем знания, мы также понимаем себя, понимаем мир, в котором живем, обретаем духовный резонанс, обретаем закрепление знание.
Поэтому я снова и снова буду подчеркивать в своей статье: если вы хотите получить более глубокие знания об этом аспекте, вы должны сами запустить его на машине, понаблюдать за ним, самостоятельно изменить несколько параметров и проверить ситуацию. Возможно, вы не можете коснуться ям, с которыми столкнулся я, а я не сталкивался с ямами, с которыми столкнулись вы. Тогда, если вы столкнетесь с этой ямой и решите ее самостоятельно, это улучшит ваши способности.
Ссылаться на
- GCVIEWER, один из самых мощных инструментов GC
- Mac устанавливает JMeter, загружает JMeter, стресс-тест JMeter Http [Иллюстрация]
- Глубокое понимание виртуальной машины Java
- Принцип JVM GC и основная идея настройки
- DELVE в JVM | Quest MetaStace
- Garbage Collection in Java (3) - Concurrent Mark Sweep
- Разговор об оптимизации GC Java-приложений из практических кейсов