Внутри Alibaba есть много инструментов собственной разработки, которые могут использовать разработчики. Среди них есть инструмент, который используется почти каждым разработчиком Java, а именно Arthas, мощный инструмент для диагностики Java и инструмент Lightning. Инструмент был открыт в сентябре 2018 года.
GitHub地址:https://github.com/alibaba/arthas用户文档:https://alibaba.github.io/arthas/
скопировать код
При ежедневной разработке вы сталкивались со следующими проблемами:
Из какого пакета jar загружается этот класс? Почему сообщается о различных исключениях, связанных с классом?
Почему код, который я изменил, не выполняется? Это потому, что я не совершал? Ветвь неправильная?
Если вы столкнулись с проблемой и не можете отладить ее онлайн, можете ли вы опубликовать ее повторно, только добавив журнал?
Есть проблема с обработкой данных пользователя онлайн, но ее нельзя отладить онлайн или воспроизвести оффлайн!
Есть ли глобальный вид, чтобы увидеть работоспособность системы?
Есть ли способ отслеживать рабочее состояние JVM в реальном времени?
Все вышеперечисленные проблемы можно диагностировать через Артаса! ! ! Разве это не хорошо и мощно.
Arthas поддерживает JDK 6+, использует интерактивный режим командной строки и предоставляетTab
Функция автозаполнения еще больше облегчает обнаружение и диагностику проблемы.
1. Установить с помощью arthas-boot
Загрузите arthas-boot.jar и запустите его с помощью java -jar:
wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar
скопировать код
Печать справочной информации:
java -jar arthas-boot.jar -h
скопировать код
Если скорость загрузки низкая, можно использовать образ Алиюн:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
скопировать код
2. Установить с помощью as.sh
Arthas поддерживает установку в один клик на таких платформах, как Linux/Unix/Mac.Скопируйте следующий контент, вставьте его в командную строку и нажмите Enter для выполнения:
curl -L https://alibaba.github.io/arthas/install.sh | sh
скопировать код
Приведенная выше команда загрузит файл сценария запуска как.sh в текущий каталог, вы можете поместить его куда угодно или добавить в свой $PATH.
Выполните ./as.sh прямо под оболочкой, чтобы войти в интерактивный интерфейс.
Вы также можете выполнить ./as.sh -h, чтобы получить больше информации о параметрах.
Быстрый старт1. Запустить демонстрацию
wget https://alibaba.github.io/arthas/arthas-demo.jarjava -jar arthas-demo.jar
скопировать код
arthas-demo
— это простая программа, которая каждую секунду генерирует случайное число, выполняет разложение на простые множители и выводит результат разложения.
2. Начать Артас
Выполните ниже командную строку:
wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar
скопировать код
-
Пользователю, выполняющему программу, нужны те же привилегии, что и целевому процессу. Такие как
admin
пользователь для выполнения:sudo su admin && java -jar arthas-boot.jar
илиsudo -u admin -EH java -jar arthas-boot.jar
. -
Если присоединение не к целевому процессу, вы можете проверить
~/logs/arthas/
журналы в каталоге. -
Если скорость загрузки низкая, можно использовать образ Алиюн:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
-
java -jar arthas-boot.jar -h
Распечатайте дополнительную информацию о параметрах.
Выберите процесс java приложения:
$ $ java -jar arthas-boot.jar* [1]: 35542 [2]: 71560 arthas-demo.jar
скопировать код
Если демонстрационный процесс является вторым, введите 2, а затем введите /enter. Артас подключится к целевому процессу и выведет журнал:
[INFO] Try to attach process 71560[INFO] Attach process 71560 success.[INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-'| .-. || '--'.' | | | .--. || .-. |`. `-.| | | || |\ \ | | | | | || | | |.-' |`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'wiki: https://alibaba.github.io/arthasversion: 3.0.5.20181127201536pid: 71560time: 2018-11-28 19:16:24$
скопировать код
3. Просмотрите информационную панель
Войдите в панель управления, нажмите ввод/ввод, отобразится информация о текущем процессе, нажмитеctrl+c
Выполнение может быть прервано.
$ dashboardID NAME GROUP PRIORI STATE %CPU TIME INTERRU DAEMON17 pool-2-thread-1 system 5 WAITIN 67 0:0 false false27 Timer-for-arthas-dashb system 10 RUNNAB 32 0:0 false true11 AsyncAppender-Worker-a system 9 WAITIN 0 0:0 false true9 Attach Listener system 9 RUNNAB 0 0:0 false true3 Finalizer system 8 WAITIN 0 0:0 false true2 Reference Handler system 10 WAITIN 0 0:0 false true4 Signal Dispatcher system 9 RUNNAB 0 0:0 false true26 as-command-execute-dae system 10 TIMED_ 0 0:0 false true13 job-timeout system 9 TIMED_ 0 0:0 false true1 main main 5 TIMED_ 0 0:0 false false14 nioEventLoopGroup-2-1 system 10 RUNNAB 0 0:0 false false18 nioEventLoopGroup-2-2 system 10 RUNNAB 0 0:0 false false23 nioEventLoopGroup-2-3 system 10 RUNNAB 0 0:0 false false15 nioEventLoopGroup-3-1 system 10 RUNNAB 0 0:0 false falseMemory used total max usage GCheap 32M 155M 1820M 1.77% gc.ps_scavenge.count 4ps_eden_space 14M 65M 672M 2.21% gc.ps_scavenge.time(m 166ps_survivor_space 4M 5M 5M s)ps_old_gen 12M 85M 1365M 0.91% gc.ps_marksweep.count 0nonheap 20M 23M -1 gc.ps_marksweep.time( 0code_cache 3M 5M 240M 1.32% ms)Runtimeos.name Mac OS Xos.version 10.13.4java.version 1.8.0_162java.home /Library/Java/JavaVir tualMachines/jdk1.8.0 _162.jdk/Contents/Hom e/jre
скопировать код
4. Получите основной класс процесса с помощью команды sysenv.
$ sysenv | grep MAIN JAVA_MAIN_CLASS_71560 demo.MathGame
скопировать код
5. Декомпилировать основной класс через jad
$ jad demo.MathGameClassLoader:+-sun.misc.Launcher$AppClassLoader@3d4eac69 +-sun.misc.Launcher$ExtClassLoader@66350f69Location:/tmp/arthas-demo.jar/* * Decompiled with CFR 0_132. */package demo;import java.io.PrintStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Random;import java.util.concurrent.TimeUnit;public class MathGame { private static Random random = new Random(); private int illegalArgumentCount = 0; public static void main(String[] args) throws InterruptedException { MathGame game = new MathGame(); do { game.run(); TimeUnit.SECONDS.sleep(1L); } while (true); } public void run() throws InterruptedException { try { int number = random.nextInt(); List<Integer> primeFactors = this.primeFactors(number); MathGame.print(number, primeFactors); } catch (Exception e) { System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage()); } } public static void print(int number, List<Integer> primeFactors) { StringBuffer sb = new StringBuffer("" + number + "="); Iterator<Integer> iterator = primeFactors.iterator(); while (iterator.hasNext()) { int factor = iterator.next(); sb.append(factor).append('*'); } if (sb.charAt(sb.length() - 1) == '*') { sb.deleteCharAt(sb.length() - 1); } System.out.println(sb); } public List<Integer> primeFactors(int number) { if (number < 2) { ++this.illegalArgumentCount; throw new IllegalArgumentException("number is: " + number + ", need >= 2"); } ArrayList<Integer> result = new ArrayList<Integer>(); int i = 2; while (i <= number) { if (number % i == 0) { result.add(i); number /= i; i = 2; continue; } ++i; } return result; }}Affect(row-cnt:1) cost in 970 ms.
скопировать код
6. watch
Просмотр через команду watchdemo.MathGame#primeFactors
Возвращаемое значение функции:
$ watch demo.MathGame primeFactors returnObjPress Ctrl+C to abort.Affect(class-cnt:1 , method-cnt:1) cost in 107 ms.ts=2018-11-28 19:22:30; [cost=1.715367ms] result=nullts=2018-11-28 19:22:31; [cost=0.185203ms] result=nullts=2018-11-28 19:22:32; [cost=19.012416ms] result=@ArrayList[ @Integer[5], @Integer[47], @Integer[2675531],]ts=2018-11-28 19:22:33; [cost=0.311395ms] result=@ArrayList[ @Integer[2], @Integer[5], @Integer[317], @Integer[503], @Integer[887],]ts=2018-11-28 19:22:34; [cost=10.136007ms] result=@ArrayList[ @Integer[2], @Integer[2], @Integer[3], @Integer[3], @Integer[31], @Integer[717593],]ts=2018-11-28 19:22:35; [cost=29.969732ms] result=@ArrayList[ @Integer[5], @Integer[29], @Integer[7651739],]
скопировать код
5. Выйти из Артаса
Если вы просто выходите из текущего соединения, вы можете использоватьquit
илиexit
Заказ. Arthas, подключенный к целевому процессу, продолжит работу, порт останется открытым, и вы сможете подключиться напрямую при следующем подключении.
Если вы хотите полностью выйти из Артаса, вы можете выполнитьshutdown
Заказ.
основная команда
-
help - просмотр справочной информации по команде
-
cls — очищает текущую область экрана
-
session - просмотреть информацию о текущей сессии
-
сброс - сбросить расширенный класс, восстановить все улучшенные классы Артаса и сбросить все расширенные классы при закрытии сервера Артаса
-
version - вывести номер версии Arthas, загруженной текущим целевым Java-процессом
-
quit - выйти из текущего клиента Arthas, другие клиенты Arthas не затрагиваются
-
shutdown — выключите сервер Arthas, и все клиенты Arthas закроются.
-
keymap — список сочетаний клавиш Arthas и настраиваемые сочетания клавиш
связанные с JVM
-
дашборд - панель данных текущей системы в реальном времени
-
thread — просмотр информации о стеке потоков текущей JVM
-
jvm — Просмотр информации о текущей JVM
-
sysprop — просмотр и изменение свойств системы JVM
-
Новинка! getstatic — просмотр статических свойств класса
связанный с классом/загрузчиком классов
-
sc — просмотр информации о классах, загруженных JVM
-
sm - Просмотр информации о методе загруженных классов
-
дамп - дамп байт-кода загруженного класса в указанную директорию
-
переопределить — загрузить внешние файлы .class, переопределить в JVM
-
jad — декомпилировать исходный код указанного загруженного класса
-
загрузчик классов — просмотр дерева наследования загрузчика классов, URL-адресов, информации о загрузке классов, использование загрузчика классов для получения ресурса
связанные с мониторингом/наблюдением/отслеживанием
-
monitor - мониторинг выполнения метода
-
watch - метод наблюдения за данными
-
trace — путь вызова внутри метода и вывод времени, затраченного на каждый узел пути метода
-
stack - вывести путь вызова, где вызывается текущий метод
-
tt — пространственно-временной туннель данных выполнения метода, записывает входные параметры и возвращаемую информацию о каждом вызове указанного метода и может наблюдать за этими вызовами в разное время.
Обратите внимание, что все эти команды реализованы с помощью технологии улучшения байт-кода. Некоторые аспекты будут вставлены в методы указанных классов для реализации статистики данных и наблюдения. Поэтому при использовании онлайн или предварительной версии постарайтесь четко понимать классы. которые необходимо соблюдать. , методы и условия. Когда диагностика завершится, выполните команду выключения или выполните команду сброса для расширенного класса.
options
-
опции - просмотреть или установить глобальные переключатели Arthas
трубопровод
Arthas поддерживает использование конвейеров для дальнейшей обработки результатов вышеуказанных команд, таких как sm org.apache.log4j.Logger | grep
-
grep — поиск результатов, соответствующих критериям
-
открытый текст - удалить цвет из результата команды
-
wc - Статистические результаты вывода по строке
Вышеизложенное является кратким введением в Артаса.Если вы хотите по-настоящему понять и использовать его как инструмент для устранения неполадок, вам нужно попрактиковаться в этом самостоятельно! Так называемая практика приносит истинное знание.
Статья в публичном аккаунте Hollis уполномочила
В последний месяц 2018 года у Hollis's Knowledge Planet действует ограниченная по времени скидка.Глубокое понимание параллельного программирования на Java: что такое безопасность потоков?Добро пожаловать присоединиться.
Столкнувшись с проблемой Java 175: что такое LocalDate и localTime в Java 8?
Road to God Issue 015: Углубленное изучение перечислений в Java.
- ЕЩЕ | Другие интересные статьи -
-
Список инструментов для устранения неполадок Java для сотрудников Alibaba
-
Внесите свой вклад в экологию Dubbo, проект Nacos с открытым исходным кодом Alibaba.
-
SpringCloud, что непрофессионалам понятно, пропустил кровопотерю!
-
Почему Alibaba запрещает инженерам напрямую использовать API системы логирования?
Если вам нравится эта статья.
Пожалуйста, нажмите и удерживайте QR-код, чтобы подписаться на Холлис
Пересылка круга друзей - самая большая поддержка для меня.