Привет, мир :) Поиск WeChat " Программист Аранг«Следуйте за мной как за специалистом по техническим инструментам.какПосмотрите еще раз, сила безгранична.
эта статьяGitHub.com/Ниу Мух/Java…иБлог программиста АрангаБыл включен, есть много точек знаний и серии статей.
Если вы часто сталкиваетесь с проблемами производительности Java в онлайн-режиме, вы беспомощны, наблюдая за стремительным ростом процессора онлайн-сервиса и обнаруживая, что память постоянно утекает. Не паникуйте, вот недорогой автономныйграфик пламени, Позвольте вам выкрикнуть полезный инструмент анализа производительности Java -async-profiler.
Недавно был запущен инструмент анализа производительности Arthas.график пламениФункция анализа, используемая Артасомasync-profilerСоздайте диаграмму пламени ЦП/памяти для анализа производительности, что компенсирует отсутствие предыдущего анализа памяти. На Артасе удобнее использовать, можно посмотреть официальную документацию по использованию. Эта статья представляетasync-profilerсвязанная информация.
Официальная документация Arthas Flame Graph:Alibaba.GitHub.IO/art has/Prof…
Если вы хотите узнать больше об Артасе, вы можете обратиться к предыдущей статье:Arthas — лучший инструмент для онлайн-обнаружения и обработки Java-проблем
Введение в асинхронный профайлер
async-profiler — это Java с открытым исходным кодом.Инструмент анализа производительности, принцип основан на HotSpot API, чтобыМинимальные потери производительностиСобирайте информацию о стеке, выделении памяти и другую информацию во время работы программы для анализа.
С помощью async-profiler можно выполнить следующий анализ.
- CPU cycles
- Hardware and Software performance counters like cache misses, branch misses, page faults, context switches etc.
- Allocations in Java Heap
- Contented lock attempts, including both Java object monitors and ReentrantLocks
Обычно мы используем анализ производительности процессора и анализ распределения памяти в куче. При выполнении профилирования ЦП толькоочень низкая производительностьанализа, что является одним из преимуществ этого инструмента.
При выполнении анализа распределения кучи средство асинхронного профилировщика собирает информацию о выделении памяти вместо обнаружения кода, интенсивно использующего ЦП. async-profiler не использует навязчивые технологии, такие как инструменты обнаружения байт-кода или обнаружение тестов, что также показывает, что анализ распределения памяти async-profiler, как и анализ производительности ЦП, не создает слишком много накладных расходов на производительность и не требует записи.огромный файл стекаперейти к дальнейшей обработке.
async-profile в настоящее время поддерживает платформы Linux и macOS (в macOS можно анализировать только код пользовательского пространства).
- Linux / x64 / x86 / ARM / AArch64
- macOS / x64
Инструмент асинхронного профилирования может генерировать журнальный отчет о результатах выборки после выборки, а также может генерировать формат SVG.график пламени, сгенерированный дографик пламенинужно использоватьFlameGraphинструмент. В этом больше нет необходимости, начиная с версии 1.2 генерация файлов SVG встроена из коробки.
Дополнительную информацию можно найти в официальной документации:GitHub.com/JVM-Prof Я…
установка асинхронного профилировщика
Чтобы загрузить инструмент асинхронного профилирования, вы можете напрямую загрузить скомпилированные файлы на официальном Github.Если вы просто хотите испытать ощущение ручной блокировки, вы также можете клонировать проект и скомпилировать его вручную.Я должен сказать, что этот инструмент очень проста в использовании Процесс компиляции прошел очень гладко и не возникло никаких проблем.
Если вы хотите скачать скомпилированную версию, вы можете скачать ее здесь.
Если вы хотите испытать ощущение ручной передачи, вы можете клонировать весь проект и скомпилировать проект.
Требования к среде для ручной компиляции.
- JDK
- GCC
Ниже приведены рабочие команды для ручной установки.
git clone https://github.com/jvm-profiling-tools/async-profiler
cd async-profiler
make
После выполнения команды make для компиляции в каталоге проекта будет сгенерирована папка сборки, в которой хранятся результаты компиляции. Ниже приведен результат процесса моей ручной компиляции.
➜ develop git clone https://github.com/jvm-profiling-tools/async-profiler
Cloning into 'async-profiler'...
remote: Enumerating objects: 69, done.
remote: Counting objects: 100% (69/69), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 1805 (delta 34), reused 32 (delta 15), pack-reused 1736
Receiving objects: 100% (1805/1805), 590.78 KiB | 23.00 KiB/s, done.
Resolving deltas: 100% (1288/1288), done.
➜ develop cd async-profiler
➜ async-profiler git:(master) make
mkdir -p build
g++ -O2 -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -DPROFILER_VERSION=\"1.6\" -I/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/include/darwin -fPIC -shared -o build/libasyncProfiler.so src/*.cpp -ldl -lpthread
gcc -O2 -DJATTACH_VERSION=\"1.5\" -o build/jattach src/jattach/jattach.c
mkdir -p build/classes
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/javac -source 6 -target 6 -d build/classes src/java/one/profiler/AsyncProfiler.java src/java/one/profiler/AsyncProfilerMXBean.java src/java/one/profiler/Counter.java src/java/one/profiler/Events.java
警告: [options] 未与 -source 1.6 一起设置引导类路径
1 个警告
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/jar cvf build/async-profiler.jar -C build/classes .
已添加清单
正在添加: one/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: one/profiler/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: one/profiler/AsyncProfiler.class(输入 = 1885) (输出 = 908)(压缩了 51%)
正在添加: one/profiler/Events.class(输入 = 405) (输出 = 286)(压缩了 29%)
正在添加: one/profiler/Counter.class(输入 = 845) (输出 = 473)(压缩了 44%)
正在添加: one/profiler/AsyncProfilerMXBean.class(输入 = 631) (输出 = 344)(压缩了 45%)
rm -rf build/classes
➜ async-profiler git:(master)
использование асинхронного профилировщика
Запустите profiler.sh в проекте, чтобы увидеть справочную документацию для async-profiler.
➜ async-profiler git:(master) ./profiler.sh
Usage: ./profiler.sh [action] [options] <pid>
Actions:
start start profiling and return immediately
resume resume profiling without resetting collected data
stop stop profiling
status print profiling status
list list profiling events supported by the target JVM
collect collect profile for the specified period of time
and then stop (default action)
Options:
-e event profiling event: cpu|alloc|lock|cache-misses etc.
-d duration run profiling for <duration> seconds
-f filename dump output to <filename>
-i interval sampling interval in nanoseconds
-j jstackdepth maximum Java stack depth
-b bufsize frame buffer size
-t profile different threads separately
-s simple class names instead of FQN
-g print method signatures
-a annotate Java method names
-o fmt output format: summary|traces|flat|collapsed|svg|tree|jfr
-v, --version display version string
--title string SVG title
--width px SVG width
--height px SVG frame height
--minwidth px skip frames smaller than px
--reverse generate stack-reversed FlameGraph / Call tree
--all-kernel only include kernel-mode events
--all-user only include user-mode events
--sync-walk use synchronous JVMTI stack walker (dangerous!)
<pid> is a numeric process ID of the target JVM
or 'jps' keyword to find running JVM automatically
Example: ./profiler.sh -d 30 -f profile.svg 3456
./profiler.sh start -i 999000 jps
./profiler.sh stop -o summary,flat jps
Вы можете видеть, что способ его использования: Использование: ./profiler.sh [action] [options] , чтокоманда+действие+параметр+PID.
Часто используемые шаги:
- Просмотрите PID процесса Java (вы можете использовать jps).
- Используйте ./profiler.sh start, чтобы начать выборку.
- Используйте статус ./profiler.sh, чтобы увидеть время выборки.
- Используйте ./profiler.sh stop, чтобы остановить выборку и вывести результаты.
Как трудоемко использовать этот метод, а конечным результатом является текстовый результат, который выглядит еще более трудоемким.Чтобы сделать его менее трудоемким, вы можете использовать образец в справке для создания примера файла SVG.
./profiler.sh -d 30 -f profile.svg 3456
Смысл этой команды в том, чтобы в течение 30 секунд выполнить выборку процесса Java с PID 3456, а затем сгенерировать файл результатов profile.svg.
По умолчанию используется анализ производительности процессора, если вы хотите выполнить другой анализ, вы можете использовать параметр -e.
-e event profiling event: cpu|alloc|lock|cache-misses etc.
Вы можете видеть, что поддерживаемыми событиями анализа являются CPU, Alloc, Lock, Cache-misses.
Корпус Async-Profiler
Роль и использование инструмента async-profiler обсуждались выше, поскольку он может выполнять анализ производительности процессора и анализ распределения памяти в куче, давайте напишем несколько необычных методов для его анализа. Посмотрите, работает ли он так же хорошо, как описано выше.
Кодирование случая Java
Есть несколько простых методов.Метод hotmethod записывает несколько общих операций.Очевидно, что операции генерации и замены UUID (требуется регулярное сопоставление) в методе hotmethod3 потребляют больше ресурсов процессора. В методе allocate, поскольку постоянно создается массив длиной 60 000, потребляемый объем памяти должен быть наибольшим.
import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;
/**
* <p>
* 模拟热点代码
*
* @Author niujinpeng
*/
public class HotCode {
private static volatile int value;
private static Object array;
public static void main(String[] args) {
while (true) {
hotmethod1();
hotmethod2();
hotmethod3();
allocate();
}
}
/**
* 生成 6万长度的数组
*/
private static void allocate() {
array = new int[6 * 1000];
array = new Integer[6 * 1000];
}
/**
* 生成一个UUID
*/
private static void hotmethod3() {
ArrayList<String> list = new ArrayList<>();
UUID uuid = UUID.randomUUID();
String str = uuid.toString().replace("-", "");
list.add(str);
}
/**
* 数字累加
*/
private static void hotmethod2() {
value++;
}
/**
* 生成一个随机数
*/
private static void hotmethod1() {
Random random = new Random();
int anInt = random.nextInt();
}
}
Анализ производительности процессора
Запустите указанную выше программу и используйте команду JPS для просмотра информации о PID.
➜ develop jps
2800 Jps
2449 HotCode
2450 Launcher
805 RemoteMavenServer36
470 NutstoreGUI
699
➜ develop
Вышеприведенное имя класса — HotCode, и вы можете видеть, что соответствующий PID — 2449.
использовать./profiler.sh -d 20 -f 2449.svg 2449
Команда сэмплирует процесс № 2449 в течение 20 секунд, а затем получает сгенерированный файл 2449.svg, а затем мы используем браузер, чтобы открыть этот файл, и мы можем увидеть загрузку ЦП.график пламени.
Как посмотреть на график пламени, одним словом:На графике пламени чем длиннее горизонтальная полоса, тем больше она используется, а информация о стеке вызовов идет снизу вверх.. На этом рисунке видно, что метод hotmethod3 имеет наибольшую загрузку ЦП среди вызовов выше основного метода.Нажмите на этот метод. Вы также можете увидеть более подробную информацию.
Видно, что метод замены занимает больше всего процессорного времени, а также является проблемой производительности в программе, на которую стоит обратить внимание.
Анализ кучи памяти
Все еще программа работает выше, PID процесса по-прежнему 2449, на этот раз используйте параметр -e для анализа использования памяти.
Заказ:./profiler.sh -d 20 -e alloc -f 2449-alloc.svg 2449
Команда означает сбор информации о памяти процесса с номером процесса 2449 в течение 20 секунд, а затем вывод ее в виде файла 2449-alloc.svg. Через 20 секунд откройте файл svg в браузере, и вы увидите распределение памяти.
По-прежнему чем длиннее горизонтальная полоса, тем больше она используется, а информация о стеке вызовов идет снизу вверх. Из рисунка видно, что метод allocate, вызываемый основным методом, использует больше всего памяти, а массив типа Integer в этом методе занимает больше всего памяти, что составляет 71%.
Код теста в этой статье был загружен на Github:GitHub.com/Bull Magic О/рог-…
Привет, мир :) Я Аланг, передовой специалист по техническим инструментам, который серьезно пишет статьи.
Статья постоянно обновляется, можете обратить внимание на номер паблика»Программист Аранг«Расти вместе. Эта статья была полученаGitHub.com/Ниу Мух/Java…и "непрочитанный код», есть много пунктов знаний и циклов статей.