концепция
Данные JFR (Java Flight Recorder, далее именуемые JFR) — это исторические события JVM, которые используются для диагностики исторической производительности и работы JVM. — это инструмент мониторинга, который собирает информацию о событиях JVM во время выполнения приложения Java. JFR откроет набор событий, при возникновении соответствующего события сохранит соответствующие данные в файле или в памяти (если включен пул буферов), а JMC может отображать эти события - в реальном времени из JVM или из файла.Get, JMC может отображать подробные записанные данные JFR. Для отслеживаемого приложения параметр JFR по умолчанию имеет низкую нагрузку на производительность: менее 1% от производительности программы, но по мере увеличения количества запущенных событий или потоков ведения журнала нагрузка на производительность также будет увеличиваться.
JFR имеет две основные концепции: события и поток данных.
событие
JFR собирает соответствующие события во время работы Java-приложения.В основном JFR предоставляет для сбора три типа событий:
- Немедленные события: регистрация данных происходит, как только происходит событие.
- Постоянные события: регистрация данных, если продолжительность превышает указанный порог
- Простые события: используются для записи активных показателей системы, в которой находится приложение (например, процессор, память и т. д.).
поток данных
События, собираемые JFR, содержат много данных, сохраняйте эти данные в файле имя_файла.jfr, а операции дискового ввода-вывода общеизвестно дороги. Поэтому JFR использует различные кэши для хранения собранных данных перед сбросом блоков данных на диск. Из-за добавления кэша в некоторых случаях данные JFR могут быть потеряны. В случае потери данных JFR попытается уведомить выходной файл о том, что часть информации потеряна.
Предварительная подготовка
Вам необходимо скачать и установить соответствующий Java Mission Control, просто скачайте его самостоятельно. Я установил Java Mission Control 8 локально (последняя версия на момент публикации статьи). JMC можно использовать в сочетании с JFR, а JMC может визуализировать XXX Файл .jfr, сгенерированный JFR. Отображение данных очень богатое. Это будет подробно объяснено позже в статье.
использовать
Включить с параметрами конфигурации:
# 加上以下的这两个参数即可开启对应的JFR功能
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
Настройка соответствующих параметров в Tomcat не действует, и я не знаю причину.Если у вас есть решение, вы можете прокомментировать его в области комментариев.
Открыть с помощью командной строки
Разблокируйте разрешения функций JFR с помощью командной строки jcmd.
jcmd process_id VM.unlock_commercial_features 解锁JFR记录功能权限
Используйте командную строку jcmd, чтобы открыть поток записи. Продолжительность периода времени записи, по умолчанию 0 с, что означает неограниченный. Следующий код использует 200 с, что означает конец записи 200 с. имя_файла указывает имя сохраненного файла.
jcmd激活 jcmd process_id JFR.start duration=100s filename=flight.jfr (JDK 11版本前需要先激活对应的功能)
Подробная командная строка
Команда jcmd содержит все операции для работы с JFR, и теперь операции и параметры объясняются подробно.
Прежде всего, если вы не знаете некоторых правил использования командной строки, вы можете использовать команду справки jcmd, чтобы понять объяснение использования соответствующей командной строки. Например, чтобы просмотреть использование JFR.check в командной строке, укажите соответствующий идентификатор процесса (в этой статье используется 5361) и используйте следующую командную строку:
jcmd 5361 help JFR.check
# 命令行返回值
5361:
JFR.check
Checks running JFR recording(s)
Impact: Low
Permission: java.lang.management.ManagementPermission(monitor)
Syntax : JFR.check [options]
Options: (options must be specified using the <key> or <key>=<value> syntax)
name : [optional] Recording name, e.g. \"My Recording\" or omit to see all recordings (STRING, no default value)
recording : [optional] Recording number, or omit to see all recordings (JLONG, -1)
verbose : [optional] Print event settings for the recording(s) (BOOLEAN, false)
Через значение английского языка мы можем понять использование каждого параметра, а также соответствующее значение и меры предосторожности.
Теперь давайте перейдем к делу.Существует четыре типа команд jcmd, связанных с JFR:
- JFR.start — начать новый поток записи JFR.
- JFR.check — проверка выполнения потоков записи JFR.
- JFR.stop — остановить указанный поток записи JFR.
- JFR.dump — копирует содержимое указанного потока записи JFR в файл.
Каждая командная строка имеет соответствующие параметры, теперь я буду вводить соответствующие параметры один за другим.
JFR.start
параметр | иллюстрировать | тип значения | По умолчанию |
---|---|---|---|
name | записать название темы | String | никто |
settings | серверный шаблон | String | никто |
defaultrecording | Начать запись по умолчанию | Boolean | False |
delay | Время задержки для начала записи | Time | 0s |
duration | длина записи | Time | 0 с (что означает навсегда, без перерыва) |
filename | название записи | String | |
compress | Сжать записанный файл результата с помощью GZip | Boolean | False |
maxage | Максимальный возраст буферных данных | Time | 0s означает отсутствие ограничения по времени |
maxsize | Максимальный объем кэш-памяти | Long | 0 означает отсутствие максимального размера |
JFR.check
параметр | иллюстрировать | тип значения | По умолчанию |
---|---|---|---|
name | записать название темы | String | никто |
recording | записать значение идентификатора потока | Long | 1 |
verbose | Печатать ли подробную информацию о данных | Boolean | False |
JFR.stop
параметр | иллюстрировать | тип значения | По умолчанию |
---|---|---|---|
name | записать название темы | String | никто |
recording | записать значение идентификатора потока | Long | 1 |
discard | Удалить записанные данные | Boolean | никто |
copy_to_file | Копировать данные журнала в файл | String | никто |
compress_copy | Сжатые файлы GZip с параметром «copy_to_file» | Boolean | False |
JFR.dump
параметр | иллюстрировать | тип значения | По умолчанию |
---|---|---|---|
name | записать название темы | String | никто |
recording | записать значение идентификатора потока | Long | 1 |
copy_to_file | Копировать данные журнала в файл | String | никто |
compress_copy | Сжатые файлы GZip с параметром «copy_to_file» | Boolean | False |
настоящий бой
После знакомства с использованием командной строки и подробного объяснения параметров теперь мы будем использовать JFR в реальном бою. Одно замечание: хотя JFR спроектирован так, чтобы оказывать незначительное влияние на производительность JVM и приложения, лучше всего установить продолжительность (duration), максимальный возраст буферных данных (maxage) и ограничить максимальный сбор. объем данных (maxsize).
Сначала определите основную программу с утечкой памяти, конкретный код выглядит следующим образом:
public static void main(String[] args) {
List<Object> items = new ArrayList<>(1);
try {
while (true){
items.add(new Object());
}
} catch (OutOfMemoryError e){
System.out.println(e.getMessage());
}
assert items.size() > 0;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
Используйте команду запуска:
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
-XX:StartFlightRecording=duration=200s,filename=flight.jfr
Когда проект запускается и возникает исключение OutOfMemoryError, в каталоге можно найти файл с именем Flight.jfr.Перетащите файл в JDK Mission Control, и он будет автоматически проанализирован. На следующем рисунке показаны результаты анализа JDK Mission Control:Теперь давайте подробно разберем результаты этой картинки:
- Красная оценка в правой части изображения указывает на то, что ключевая часть анализа будет подробно описана после расширения, например, первая точка
Application Halts
Указывает, что время паузы приложения слишком велико из-за GC, а пропорция высока. Если вы действительно не хотите его читать, скопируйте и вставьте его в программу-переводчик, и вы поймете общий смысл. - Боковая панель в левой части изображения представляет подробные записи каждого блока анализа, включая память, сборщик мусора, ввод-вывод и т. д. Красный восклицательный знак — ключевая часть, которую необходимо просмотреть. Например, давайте посмотрим на память
Как видно из рисунка, использование памяти приложением быстро заполняется в течение 5 секунд, а затем запускает операцию GC.Какой метод вызывает такое быстрое использование памяти? в соответствии с
Method Profiling
Из результатов анализа видно, что операция копирования ArrayList приводит к следующему рисунку:
Из вышеперечисленных операций мы можем быстро найти метод блока переполнения памяти.Вы можете просмотреть использование других блоков, когда будете анализировать их самостоятельно.Визуальный интерфейс очень удобен. При использовании JFR не определяйте слишком большие временные блоки в конце или вам нужно разделить временные блоки на маленькие блоки для анализа, потому что большие временные блоки приведут к тому, что файл JFR будет очень большим, и когда он анализируется локально, он также приведет к задержке или Недостаточно памяти компьютера, в результате чего локальный компьютер зависнет и не сможет выполнить анализ.
использованная литература
Monitoring Java Applications with Flight Recorder
Полное руководство по производительности Java
JDK Mission Control