Arthas -- 一款釋放潛力的神器

来源:https://www.cnblogs.com/88223100/archive/2023/07/27/Arthas---a-divine-tool-for-unleashing-potential.html
-Advertisement-
Play Games

1. 介紹 阿裡巴巴 Arthas 是一個診斷工具,可以用於監視、分析和解決 Java 應用程式的問題。使用 Arthas 的一個主要優點是,我們不需要修改代碼,甚至不需要重新啟動我們想要監視的 Java 服務。 在本教程中,我們將首先安裝 Arthas,在此之後,通過一個簡單的案例來演示 Arth ...


1. 介紹

阿裡巴巴 Arthas 是一個診斷工具,可以用於監視、分析和解決 Java 應用程式的問題。使用 Arthas 的一個主要優點是,我們不需要修改代碼,甚至不需要重新啟動我們想要監視的 Java 服務。

在本教程中,我們將首先安裝 Arthas,在此之後,通過一個簡單的案例來演示 Arthas 的一些關鍵特性。

最後,由於 Arthas 是用 Java 編寫的,因此它是跨平臺的,可以在 Linux、macOS 和 Windows 上運行。

2. 下載和入門

首先,我們可以通過直接下載鏈接或使用curl來下載 Arthas 庫:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

現在,讓我們通過運行帶有-h(幫助)選項的 Arthas 來測試它是否工作:

java -jar arthas-boot.jar -h

如果成功,我們應該看到顯示所有命令的幫助指南:

圖片

3. 案例分析

在本教程中,我們將使用一個非常簡單的應用程式,基於利用遞歸實現的斐波那契數列的相對低效的實現方式:

public class FibonacciGenerator {

    public static void main(String[] args) {
        System.out.println("按任意鍵繼續");
        System.in.read();
        for (int i = 0; i < 100; i++) {
            long result = fibonacci(i);
            System.out.println(format("fib(%d): %d", i, result));
        }
    }

    public static long fibonacci(int n) {
        if (n == 0 || n == 1) {
            return 1L;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

這個示例的最有趣的部分是遵循斐波那契數列的數學定義的 fibonacci 方法。

在 main 方法中,我們使用一個迴圈和相對較大的數字,以便讓電腦進行較長時間的計算。這當然正是我們想要的,以便演示 Arthas。

4. 啟動 Arthas

現在讓我們試試 Arthas!我們需要做的第一件事是運行我們的小型斐波那契應用程式。我們可以使用我們喜歡的 IDE 或直接在終端中運行它。它會要求按下一個鍵才能啟動。我們將在將進程附加到 Arthas 之後按下任意鍵。

現在,讓我們運行 Arthas 可執行文件:

java -jar arthas-boot.jar

Arthas 提示選擇要附加到的進程:

[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 25500 com.baeldung.arthas.FibonacciGenerator
...

讓我們選擇名稱為 com.baeldung.arthas.FibonacciGenerator 的進程。在此示例中,只需在列表中輸入數字‘1’並按 Enter 即可。

Arthas 現在會附加到該進程並啟動:

[INFO] Try to attach process 25500
[INFO] Attach process 25500 success.
...                     

一旦 Arthas 啟動,我們就有一個提示符,可以發出不同的命令。

我們可以使用 help 命令獲取有關可用選項的更多信息。為了方便使用 Arthas,我們還可以使用 tab 鍵來自動完成其命令。

在將 Arthas 附加到進程後,我們現在可以按下一個鍵,程式將開始列印斐波那契數。

5. 儀錶盤

一旦 Arthas 啟動,我們可以使用儀錶盤。在這種情況下,我們通過輸入 "dashboard" 命令來使用儀錶盤。現在,我們可以看到一個詳細的屏幕,其中包含多個面板和關於我們的 Java 進程的許多信息:

圖片

讓我們更詳細地看一下其中的一些內容:

  • 頂部區域專門顯示當前正在運行的線程
  • 一個重要的列是每個線程的 CPU 使用情況
  • 第三部分顯示每個線程的 CPU 時間
  • 另一個有趣的面板是記憶體分析。不同的記憶體區域以及它們的統計信息都列在其中。在右側,我們有垃圾收集器的信息
  • 最後,在第五部分,我們有關於主機平臺和 JVM 的信息

我們可以通過按下 "q" 鍵退出儀錶盤。

我們應該記住,即使退出,Arthas 仍會附加到我們的進程上。因此,為了正確地從我們的進程中斷開它的連接,我們需要運行 "stop" 命令。

6. 分析堆棧跟蹤

在儀錶盤中,我們看到我們的主進程占用了幾乎 100% 的 CPU。該進程的 ID 是 1,在第一列中可以看到。

現在我們已經退出了儀錶盤,我們可以通過運行 "thread" 命令來更詳細地分析該進程:

thread 1

作為參數傳遞的數字是線程 ID。Arthas 列印出一個堆棧跟蹤信息,其中充斥著對 fibonacci 方法的調用。

如果堆棧跟蹤信息很長而且難以閱讀,可以使用 "thread" 命令結合 "grep" 命令來過濾:

thread 1 | grep 'main('

這將只列印與 "grep" 命令匹配的行:

[arthas@25500]$ thread 1 | grep 'main('
    at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)

7. 反編譯Java類

假設我們正在分析一個我們對其中瞭解甚少或一無所知的Java應用程式,突然發現堆棧中充斥著以下類型的重覆調用:

[arthas@59816]$ thread 1
"main" Id=1 RUNNABLE
  at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
  at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
  ...

由於我們運行了Arthas,我們可以反編譯一個類來查看其內容。為了實現這一點,我們可以使用jad命令,將限定類名作為參數傳遞:

jad com.baeldung.arthas.FibonacciGenerator

類載入器:
+-jdk.internal.loader.ClassLoaders $ AppClassLoader @ 799f7e29
  +-jdk.internal.loader.ClassLoaders $ PlatformClassLoader @ 60f1dd34

位置:
/home/amoreno/work/baeldung/tutorials/libraries-3/target/
/*
 * 反編譯使用CFR。
 */
package com.baeldung.arthas;

import java.io.IOException;
import java.io.InputStream;
importjava.io.PrintStream;

public class FibonacciGenerator {
    public static void main(String[] arrstring) throws IOException {

輸出是反編譯的Java類和一些有用的元數據,如類的位置。這是一個非常有用和強大的功能。

8. 搜索類和搜索方法

搜索類命令在搜索JVM中載入的類時非常方便。我們可以使用它通過輸入sc並將模式作為參數傳遞來使用,帶或不帶通配符:

[arthas@70099]$ sc *Fibonacci*
com.baeldung.arthas.FibonacciGenerator
Affect(row-cnt:1) cost in 5 ms.

一旦我們獲得了類的限定名稱,我們可以使用兩個附加標誌來查找更多信息:

  • -d顯示類的詳細信息
  • -f顯示類的欄位

然而,類的欄位必須與詳細信息一起查詢:

[arthas@70099]$ sc -df com.baeldung.arthas.FibonacciGenerator
  class-info        com.baeldung.arthas.FibonacciGenerator
  ...

同樣,我們可以使用sm(搜索方法)命令來查找類中載入的方法。在這種情況下,對於我們的類com.baeldung.arthas.FibonacciGenerator,我們可以運行:

[arthas@70099]$ sm com.baeldung.arthas.FibonacciGenerator
com.baeldung.arthas.FibonacciGenerator <init>()V
com.baeldung.arthas.FibonacciGenerator main([Ljava/lang/String;)V
com.baeldung.arthas.FibonacciGenerator fibonacci(I)J
Affect(row-cnt:3) cost in 4 ms.

我們可以使用-d標誌來檢索方法的詳細信息。最後,我們可以傳遞方法的名稱作為可選參數,以縮小返回方法的數量:

sm -d com.baeldung.arthas.FibonacciGenerator fibonacci
 declaring-class  com.baeldung.arthas.FibonacciGenerator
 method-name      fibonacci
 modifier         public,static
 annotation
 parameters       int
 return           long
 exceptions
 classLoaderHash  799f7e29

9. 監視方法調用

我們可以使用Arthas來監視方法,這在調試應用程式的性能問題時非常方便。為此,我們可以使用monitor命令。

monitor命令需要一個-c <秒數>標誌和兩個參數 - 限定類名和方法名。

對於我們的案例研究,讓我們來調用monitor:

monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci

正如我們所預期的,Arthas將每10秒列印有關fibonacci方法的指標:

Affect(class-cnt:1 , method-cnt:1) cost in 47 ms.
 timestamp            class                                          method     total   success  fail  avg-rt(ms)  fail-rate                                                                       
-----------------------------------------------------------------------------------------------------------------------------                                                                      
 2020-03-07 11:43:26  com.baeldung.arthas.FibonacciGenerator  fibonacci  528957  528957   0     0.07        0.00%
...                                                                           

對於那些最終失敗的調用,我們也有指標 - 這對於調試很有用。

10. 監控方法參數

如果我們需要調試方法的參數,我們可以使用watch命令。但是,語法會稍微複雜一些:

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10

讓我們詳細看一下各個參數:

  • 第一個參數是類名
  • 第二個參數是方法名
  • 第三個參數是定義我們要查看的內容的OGNL表達式 - 在這種情況下,它是第一個(也是唯一的)方法參數和返回值
  • 第四個和最後一個可選參數是用於過濾我們要監視的調用的布爾表達式

對於此示例,我們只想在參數大於10時監視。最後,我們添加一個標誌來限制結果為10個:

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10
按Q或Ctrl+C中斷。
Affect(class-cnt:1 , method-cnt:1) cost in 19 ms.
ts=2020-02-17 21:48:08; [cost=30.165211ms] result=@ArrayList[
    @Integer[11],
    @Long[144],
]
ts=2020-02-17 21:48:08; [cost=50.405506ms] result=@ArrayList[
    @Integer[12],
    @Long[233],
]
...

在這裡,我們可以看到帶有CPU時間和輸入/返回值的調用示例。

11. 分析器

對於那些對應用程式性能感興趣的人來說,通過分析器命令提供了一種非常直觀的能力。分析器將評估我們的進程正在使用的CPU的性能。

讓我們通過運行profiler start來啟動分析器。這是一個非阻塞的任務,意味著在分析器工作時我們可以繼續使用Arthas。

隨時可以通過運行profiler getSamples來詢問分析器有多少個樣本。

現在讓我們使用profiler stop來停止分析器。此時,一個FlameGraph圖像將被保存。在這個具體的案例中,我們有一個以斐波那契線程為主導的圖表:

圖片

註意,當我們想要檢測我們的CPU時間花在哪裡時,這個圖表特別有用。

12. 總結

在本教程中,我們探索了Arthas的一些最強大和有用的功能。

正如我們所見,Arthas有許多命令可以幫助我們診斷各種問題。當我們無法訪問正在審查的應用程式的代碼,或者我們想快速診斷在伺服器上運行的有問題的應用程式時,它也可以特別有幫助。


參考資料:

  1. 官方文檔:https://arthas.aliyun.com/doc/
  2. Arthas的GitHub倉庫地址:https://github.com/alibaba/arthas

 

作者|Yuan

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Arthas---a-divine-tool-for-unleashing-potential.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 本文我們會先聊聊 DOM 的一些缺陷,然後在此基礎上介紹虛擬 DOM 是如何解決這些缺陷的,最後再站在雙緩存和 MVC 的視角來聊聊虛擬 DOM。理解了這些會讓你對目前的前端框架有一個更加底層的認識,這也有助於你更好地理解這些前端框 ...
  • Vue的路由在執行跳轉時,根據源碼可知,調用了router中定義的navigate函數,源碼中可以看出,由Promise then的鏈式調用保證了路由守衛按照以下順序執行 ...
  • JSX語法  JSX是一種JavaScript的語法擴展(eXtension),也在很多地方稱之為JavaScript XML,因為看起就是一段XML語法;  它用於描述我們的UI界面,並且其完成可以和JavaScript融合在一起使用;  它不同於Vue中的模塊語法,你不需要專門學習模塊語法 ...
  • 提起長連接,我們並不陌生,最常見的長連接非websocket莫屬了。即使沒有在項目中實際用過,至少也應該有所接觸。長連接指在一次網路通信中,客戶端與伺服器之間建立一條持久的連接,可以在多次請求和響應中重覆使用該連接。 ...
  • 本文從為什麼需要WebAssembly、WebAssembly的工作原理、哪些語言可用來創建WebAssembly模塊、WebAssembly可以用在哪裡 以及 怎麼使用 幾方面簡要介紹了webAssembly。如果之前沒有瞭解過webAssembly,可以做一些簡要的瞭解。 ...
  • # Jenkins-Pipline原理 > 本文僅探討jenkins pipline 的原理,是流水線的一個demo版本實現,不能代表Jenkins pipline的具體實現,僅供參考。 ## 1. Jenkins流水線介紹 Jenkinsfile流水線是Jenkins CI/CD工具中用來定義、構 ...
  • 在武俠世界里,“利器”通常指的是武器中的上乘、出色之物;武器對於武者的重要性不言而喻,擁有一把優秀的武器可以讓武者在戰鬥中更加得心應手,威力更強。在分散式系統追求高可用的背景下,熔斷、限流和降級這三個重要的策略可以稱得上三大利器。降級和熔斷是不是一回事?限流 與 降級呢? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...