1. Введение
Arthas — это инструмент диагностики Java с открытым исходным кодом от Alibaba, любимый разработчиками.
Артас может помочь вам, когда вы столкнулись с такими проблемами, как:
- Из какого пакета jar загружается этот класс? Почему сообщается о различных исключениях, связанных с классом?
- Почему код, который я изменил, не выполняется? Это потому, что я не совершал? Ветвь неправильная?
- Если вы столкнулись с проблемой и не можете отладить ее онлайн, можете ли вы опубликовать ее повторно, только добавив журнал?
- Есть проблема с обработкой данных пользователя онлайн, но ее нельзя отладить онлайн или воспроизвести оффлайн!
- Есть ли глобальный вид, чтобы увидеть работоспособность системы?
- Есть ли способ отслеживать рабочее состояние JVM в реальном времени?
Arthas поддерживает JDK 6+, поддерживает Linux/Mac/Winodws, принимает интерактивный режим командной строки и предоставляет богатые функции автозаполнения вкладок для дальнейшего облегчения обнаружения и диагностики проблем.
2 основные функции
Функции, предоставляемые Arthas, можно разделить на следующие три аспекта:
- (1) Информационный мониторинг
- Основная информация о процессе: память, использование ЦП, информация о потоках, стек потоков, статистика количества потоков, информация о переменных среды.
- Информация об объекте: статические атрибуты объекта класса, информация об атрибуте MBean, информация о загруженном классе, загрузчик класса, информация о методе класса
- (2) Вызов метода
- Входные параметры вызова метода, просмотр возвращаемого значения
- Статистические данные, такие как путь вызова вызываемого метода, время вызова, количество вызовов метода, количество успехов, количество сбоев и т. д.
- Записывать и повторять вызовы методов
- (3) Обработка файла класса
- дамп байт-кода загруженных классов, декомпиляция байт-кода, компиляция класса, перезагрузка класса
3 Установка и использование
3.1 Установка
Загрузите arthas-boot.jar и запустите его с помощью java -jar:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
Затем введите соответствующий номер процесса и войдите в командный интерфейс Артаса для использования:
Печать справочной информации:
java -jar arthas-boot.jar -h
3.2 Использование
Далее представлены некоторые часто используемые команды, использование и принципы Arthas, а также показано, как решать наши актуальные проблемы.Подробности команд см. в официальных документах Arthas.
(1) Общие данные приборной панели
В интерфейсе командной строки arthas введите команду панели инструментов, она отобразит текущий статус многопоточности tomcat, области JVM, статус GC и другую информацию в режиме реального времени.
(2) Просмотр мониторинга потока
Введите команду потока, чтобы отобразить информацию о состоянии всех потоков. Ввод thread -n 3 отобразит 3 самых загруженных потока, которые можно использовать для проверки потребления ЦП потоком. Ввод thread -b отобразит поток, который в настоящее время находится в состоянии BLOCKED, и вы сможете устранить проблему блокировки потока.
(3) Мониторинг JVM
Введите команду jvm, jvm для просмотра подробных данных о производительности.
(4) Соблюдайте параметры метода и возвращаемые значения
Иногда нам нужно проверить параметры и возвращаемые значения при устранении неполадок.Обычно нам нужно добавить печать журнала, что громоздко.На основе команды watch мы можем легко все это сделать.
$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
@Object[][
@Integer[535629513],
],
@ArrayList[
@Integer[3],
@Integer[19],
@Integer[191],
@Integer[49199],
],
]
(5) Соблюдайте путь вызова метода, отнимающие много времени детали
Иногда служба зависает, и если вы хотите узнать, какой шаг занимает много времени, обычным методом является добавление журналов.Использование команды трассировки может легко решить эту проблему:
$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[10.611029ms] demo.MathGame:run()
+---[0.05638ms] java.util.Random:nextInt()
+---[10.036885ms] demo.MathGame:primeFactors()
`---[0.170316ms] demo.MathGame:print()
4 Принцип реализации
Общий график вызова макромодуля выглядит следующим образом:
Из соображений экономии места ниже приводится краткое введение в два основных принципа:
(1) Мониторинг информации, обработка файлов класса
JMX (Java Management Extensions Java Management Extensions, который представляет собой структуру для внедрения функций управления для приложений), предоставляемый JDK, JMX управляет серией объектов MBean, Arthas основан на этих объектах MBean для получения памяти, GC, информации о загрузке классов, JVM информационный мониторинг
(2) Вызов метода
Начиная с JDK5, был введен java.lang.Instrument, и программисты могут динамически изменять код класса, изменяя байт-код метода. Среди параметров в методе прокси-класса есть экземпляр Instrumentation inst. Через этот экземпляр мы можем вызывать различные интерфейсы, предоставляемые Instrumentation. Например, вызовите inst.getAllLoadedClasses(), чтобы получить все загруженные классы. Вызовите inst.addTransformer(new SdlTransformer(), true), чтобы добавить преобразователь. Вызовите inst.retransformClasses(Class cls), чтобы инициировать запрос на повторное преобразование в JVM.
Артас использует ASM для создания байт-кода расширенного класса.Расширенные функции включают параметры вызова метода, просмотр возвращаемого значения, статистику вызова метода, записи вызова метода и повтор, а затем методы добавляются и преобразуются на основе интерфейса Instrumentation, предоставляемого JDK.
5 реальный случай
Официальная документация Arthas содержит множество вариантов использования, вот еще несколько интересных:
(1) Проверьте источник странных журналов в приложении.Детали дела
Некоторые странные журналы иногда появляются во время работы приложения-службы, и устранить неполадки и найти источник этих журналов сложно. Изменив код реализации StringBuilder, чтобы распечатать информацию о стеке вызовов из журнала, скомпилировать и сгенерировать StringBuilder.clss, а затем изменить фактический байт-код StringBuilder, используемый в приложении, на основе команды переопределения, предоставленной Артасом.
(2) Устранение неполадок приложения SpringBoot 401/404Детали дела
Доступ к странице возвращает 401/404, что обычно является головной болью при возникновении такой проблемы, особенно в онлайн-среде. С помощью команды трассировки, предоставленной Артасом, распечатайте полное дерево запросов при доступе к странице и найдите конкретный сервлет, который возвращает 404.
$ trace javax.servlet.Servlet *
Press Ctrl+C to abort.
Affect(class-cnt:7 , method-cnt:185) cost in 1018 ms.
С помощью команды trace объект Trace представляет собой позиционирование Javax.Servlet.filter, которое FILTER блокирует позиционирование запроса, возвращает 401 проблему Источник
$ trace javax.servlet.Filter *
Press Ctrl+C to abort.
Affect(class-cnt:13 , method-cnt:75) cost in 278 ms.
(3) Горячее обновление онлайн-кодаДетали дела
Иногда, чтобы быстро проверить исправления онлайн-проблем или для быстрого тестирования, нам нужно «горячее» обновление кода. Шаги решения, предоставленные Arthas, следующие:
- Шаг 1. Команда jad декомпилирует код
- Шаг 2 Текстовый редактор для изменения кода
- Шаг 3 Используйте команду sc, чтобы найти ClassLoader класса, в котором находится код.
- Шаг 4 Команда MC указывает классную загрузку для компиляции кода
- Шаг 5 переопределить код горячего обновления команды
Ссылаться на
Официальная документация Артаса
6 к летающему инструменту диагностики Java Arthas
Расшифруйте онлайн-инструменты диагностики проблем Ali Arthas и jvm-sandbox