Удивительный инструмент диагностики Java с молнией в Ali наконец-то стал открытым исходным кодом

Java задняя часть JVM открытый источник

Внутри 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.

- ЕЩЕ | Другие интересные статьи -

Если вам нравится эта статья.

Пожалуйста, нажмите и удерживайте QR-код, чтобы подписаться на Холлис

Пересылка круга друзей - самая большая поддержка для меня.