Arthas
Сначала цитирую официальный отрывок:
Arthas — это инструмент диагностики Java с открытым исходным кодом от Alibaba, который очень популярен среди разработчиков. Артас может помочь вам, когда вы столкнулись с такими проблемами, как:
- Из какого пакета jar загружается этот класс? Почему сообщается о различных исключениях, связанных с классом?
- Почему код, который я изменил, не выполняется? Это потому, что я не совершал? Ветвь неправильная?
- Если вы столкнулись с проблемой и не можете отладить ее онлайн, можете ли вы опубликовать ее повторно, только добавив журнал?
- Есть проблема с обработкой данных пользователя онлайн, но ее нельзя отладить онлайн или воспроизвести офлайн!
- Есть ли глобальный вид, чтобы увидеть работоспособность системы?
- Есть ли способ отслеживать рабочее состояние JVM в реальном времени?
- Arthas использует режим взаимодействия с командной строкой и предоставляет богатые функции автозаполнения с помощью вкладок, что еще больше упрощает обнаружение и диагностику проблем.
Потом к картинке:
Команды, поддерживаемые Артасом, показаны на рисунке, для конкретного использования каждой команды обратитесь к официальной документации:Alibaba.GitHub.IO/art.
Причина, по которой Артас упоминается здесь, заключается в следующем: хотя VisualVM проделал хорошую работу по дампу, мониторингу, снимкам и т. д., в некоторых областях ему все еще не хватает! В это время Артас может сыграть в свою пользу. Конкретные области отражены в:
-
thread
Вы можете напрямую просмотреть коэффициент использования процессора потока(Из предыдущего документа также видно, что VisualVM немного проблематичен для просмотра соотношения потоков ЦП) -
redefine
Загружать файлы внешних классов в приложение(VisualVM не имеет этой функции, и на рынке плагинов, похоже, не найти подходящих плагинов) -
monitor
Отслеживайте количество вызовов методов, успехи, неудачи, среднее RT и т. д. -
watch tt
Когда метод наблюдения выполняется до, после, в конце, исключение, и если время слишком велико, входные параметры (можно настроить глубину входных параметров), возвращаемое значение, исключение, который поддерживает мониторинг в реальном времени выполнения каждого метода и всех вызовов методов. -
jad
Декомпилируйте файл класса (больше не нужно распаковывать его из jar-файла, а затем использовать инструмент jad для его декомпиляции) -
sc sm
Быстрый поиск информации о классах и методах -
getstatic
Просмотр статических переменных класса (VisualVM может видеть только свойства экземпляра) -
sysprop
Изменить свойства системы -
trace
Посмотреть, каквызов дерева времени, VisualVM тоже может смотреть, но VisualVM больше похож на метод поиска нити из глобального отнимающего много времени, а Артас может напрямую найти метод для наблюдения, иУсловия настройки поддержкиПечать, например, когда время превышает определенное значение, входной параметр имеет определенное значение и т. д. -
stack
Посмотреть все пути в дереве вызовов метода.Аналогично VisualVM реально может его увидеть,но все равно ощущается как глобальный поиск локального метода,а Arthas это прямое позиционирование локальных методов,и то же самоеУсловия настройки поддержки, когда время выполнения превышает определенное значение и т. д., выводятся все пути вызовов, вызывающие метод.
Подводя итог: VisualVM и Arthas могут дополнять друг друга, первый больше похож на глобального наблюдателя, контролирующего общую работу! Последний больше похож на локального сотрудника по отладке, который может отслеживать методы и даже уточнять параметры до и после выполнения метода, поэтому он чаще используется в调试排查
!
Основные команды и параметры
Вот основные команды, которые я использую:
- helpПосмотреть справку по команде, например: help getstatic
- clsочисти экран
- quitВыйти из текущего клиента Arthas
- shutdownВыйти из всех открытых клиентов Arthas
Ниже приведены основные параметры, которые я обычно использую:
- -nОграничьте количество отпечатков, таких как выполнение программы, некоторые методы могут печатать безумно.
- -iУстановите время интервала печати, ед.миллисекунда
- -xГлубина обхода свойства, по умолчанию1.
Общие выражения:
- *любое количество любых символов
- #costпотраченное время
Посмотреть отношение потока к процессору
thread -n 3 //查看cpu占比前三的线程
thread -i 1000 //间隔
загрузить внешний класс
redefine -p d://tmp/Test.class //加载指定位置的class文件
redefine -c 256a485d -p d://tmp/Test.class //让指定的classloader来加载,256a485d为该classloader的hashcode,可通过classloader命令来查得
Отслеживайте вызовы методов, успехи и т. д.
monitor -c 5 cn.localhost01.* check //统计周期5秒,默认120秒
Возвращаемый входной параметр метода мониторинга и т. д.
Однократное выполнение метода обнаружения в реальном времени
watch cn.localhost01.* check "params,reurnObj" -x 2 -b -s //同时检测方法调用前后的入参和返回值,参数和返回值的属性遍历深度为2,一共可支持设置 -b(调用前)、 -e(异常时)、-s(返回后)、-f(结束后)
watch cn.localhost01.* check "params,returnObj" "params[0].name.equals('abc')" -x 3 -b //满足条件才打印
watch cn.localhost01.* check "params,returnObj" #cost>200 -x 3 //满足条件才打印
Метод тестовой записи всех исполнений
tt -t -n 20 cn.localhost01.* check
После записи в течение определенного периода времени необходимо проверить некоторые методы:
tt -l //-list,查看所有记录的方法,结果集会展示出每个方法的INDEX索引序号
Найти путь:
tt -s method.name="check" //-search,查看方法名为check的方法
Определите метод в соответствии с ИНДЕКСОМ:
tt -i 1001 //-index,查看索引为1001的方法
повторить вызов:
tt -i 1001 -p //-play,重执行
декомпилировать
jad cn.localhost01.demo.Checker
быстрый поиск
sc cn.*.Checker //搜索类
sm *.Checker check //搜索方法
Просмотр статических переменных
getstatic *.Checker pool //注意,查不到常量
Изменить свойства системы
sysprop java.version 1.7
Просмотр дерева вызовов методов отнимает много времени
trace cn.loacalhost01.* check params.length==2 //查看含有两个参数的check方法调用树耗时
trace cn.loacalhost01.* check #cost>500 //查看耗时超过500毫秒的check方法调用树耗时
Просмотр всех путей дерева вызовов метода
stack cn.loacalhost01.* check params[0]==78 //查看第一个参数值为78的check方法调用树耗时
stack cn.loacalhost01.* check #cost>500 //查看耗时超过500毫秒的check方法调用树耗时
Уведомление
-
Как видно из вышеизложенного, мы будем часто использовать
命令 classpath methodname
, а дляmethod, если есть перегрузка, если вы различаете, какой метод вы хотите отслеживать?- tt -t cn.localhost01.* check "params.length==2" //Метод с двумя параметрами
- tt -t cn.localhost01.* check "params[0] instanceof String" //Первый параметр должен иметь тип String
- tt -t cn.localhost01.* check "params[1].password='123456'" //Значение свойства пароля второго объекта значения параметра равно 123456
-
Когда идея запускает приложение, иногда
as.bat pid
После открытия определяется не входной pid, это может быть баг!