全部產品
Search
文件中心

Application Real-Time Monitoring Service:Arthas診斷

更新時間:Jun 17, 2026

Arthas是診斷Java領域線上問題的利器,利用位元組碼增強技術,可以在不重啟JVM進程的情況下,查看程式的運行情況。

前提條件

重要
  • ARMS應用監控面向已開通新版計費的使用者提供全新的監控詳情頁面,新版計費詳情,請參見產品計費(新版)

    對於未開通新版計費的使用者,如需查看新版監控詳情頁面,可在應用列表頁面單擊切換新版

  • 該功能目前僅支援Java應用。

  • Arthas診斷功能建議只在排查問題時開啟,在日常使用時建議關閉。

  • ARMS Agent版本為v2.7.1.3或以上。

  • 已接入應用監控。具體操作,請參見應用監控概述

  • 應用的程式設計語言需要為Java。

背景資訊

ARMS提供的Arthas診斷功能主要用於補齊ARMS在即時診斷方面的能力。ARMS的Arthas診斷功能包括以下幾種類型:

  • JVM概覽:查看當前JVM進程即時的記憶體使用量情況、系統資訊、系統變數和環境變數。

  • 線程分析:查看當前JVM進程的線程耗時情況以及指定線程的即時方法棧。

  • 方法執行分析:抓取任意方法(非JDK方法)滿足指定條件的一次執行記錄,記錄該方法的參數、異常、傳回值以及方法內部各個方法執行耗時。

  • 對象查看器:查看任意類的某個執行個體即時的屬性取值情況。

  • 即時看板:常見組件的即時看板,例如,Druid串連池的即時看板可以看到串連池的配置、使用方式以及SQL執行耗時情況。

  • 效能分析:對CPU耗時、記憶體配置等對象進行一定時間的採樣並產生相應的火焰圖。

  • Arthas Shell:通過命令列方式使用Arthas診斷。

Arthas版本資訊

ARMS Agent版本為v2.7.1.3~4.6.x對應的Arthas版本為3.5.6。4.7.x及以上對應的Arthas版本為4.1.0。

開通Arthas診斷功能

  1. 登入ARMS控制台,在左側導覽列選擇应用监控 > 应用列表

  2. 应用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    语言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    image:接入應用監控的Python應用。

    -:接入可觀測鏈路 OpenTelemetry 版的應用。

  3. 在上方導覽列選擇应用配置 > 自定义配置

  4. Arthas监控地區,開啟Arthas開關,根據需求選擇是否僅對部分IP進行Arthas診斷,並添加目標IP。

  5. 單擊保存

查看Arthas診斷資訊

  1. 登入ARMS控制台,在左側導覽列選擇应用监控 > 应用列表

  2. 应用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    语言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    image:接入應用監控的Python應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在上方導覽列選擇应用诊断 > Arthas 诊断

  4. 在Arthas診斷頁面頂部下拉式清單選擇待診斷的應用執行個體。

    • 若該執行個體的Agent版本未升級至2.7.1.3或以上,頁面會提示您需要先升級Agent。

    • 若該執行個體的Agent版本已升級至2.7.1.3或以上,頁面會顯示該執行個體的Arthas診斷資訊。

JVM概覽

JVM概覽支援查看應用的JVM相關資訊,包括JVM記憶體、作業系統資訊、變數資訊等,協助您瞭解JVM的總體情況。

Arthas診斷頁面預設顯示JVM概览頁簽,您可以在JVM概览頁簽查看以下資訊:

  • JVM内存:JVM記憶體的相關資訊,包括堆記憶體使用量情況、非堆記憶體使用量情況、GC情況等。其中表格以heapbuffer_poolnonheap分類展示各記憶體地區的已使用量總量最大量以及GC類型對應的總次數總耗時

  • 操作系统信息:作業系統的相關資訊,包括平均負載情況,作業系統名稱、作業系統版本、Java版本等。具體欄位包括systemLoadAverageosVersionjavaVersionprocessorsosNamejavaHometimestampuptime

  • 变量信息:變數的相關資訊,包括系統變數和環境變數。頁面分為左側系統變數和右側環境變數兩個面板,各提供搜尋方塊可按關鍵字篩選,以索引值對形式展示變數名稱和取值。

線程耗時分析

線程耗時分析支援顯示該應用的所有線程和查看線程的堆棧資訊,協助您快速定位耗時較高的線程。

  1. 在Arthas診斷頁面,單擊线程耗时分析頁簽。

    线程耗时分析頁簽會即時擷取當前JVM進程的線程耗時情況,並將相似線程彙總。頁面頂部顯示各狀態線程數(NEWTERMINATEDRUNNABLEBLOCKEDWAITINGTIMED_WAITING),下方表格以Name總CPU數量為列彙總展示線程,展開可查看各線程的ID、CPU使用率、State和查看即時堆棧操作入口。

  2. 單擊線程左側的+表徵圖展開線程明細,可以查看線程的ID、CPU使用率和狀態。

  3. 如需查看目標線程的堆棧資訊,您可以在目標線程右側的操作列,單擊查看实时堆栈

    彈出線程詳情對話方塊,顯示線程名稱、狀態(如RUNNABLE)以及完整的Java堆棧資訊。

方法執行分析

方法執行分析支援抓取方法的某一次執行的耗時、入參、傳回值等資訊和鑽入,協助您快速定位導致慢調用的根本原因,以及問題線下無法複現或日誌缺失等情境。

  1. 在Arthas診斷頁面,單擊方法执行分析頁簽。

  2. 方法执行分析頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊搜尋表徵圖。

  3. 在搜尋到的類中選擇需要診斷的類,然後在右側方法選擇框選取該類的某個方法,單擊确定

    頁面將會顯示ARMS隨機抓取的該方法的某一次執行的資訊。

    • 左側執行堆棧地區顯示診斷方法的內部執行記錄。

      • 如需鑽入某個內部方法,在其右側操作列,單擊钻入

      • 如需查看方法源碼,單擊執行堆棧地區頂部的查看方法源碼

        每一次內部方法的執行耗時都會以注釋的方式顯示在原始碼中。

    • 右側方法執行結果地區顯示方法執行的參數值、傳回值、異常、成員變數以及此次方法執行的TraceID。

    • 右側設定執行條件地區執行以下步驟,可以設定方法執行條件來抓取滿足條件的方法執行記錄。

      1. 選擇當前方法中的一個重載方法。

      2. 請選擇初始過濾key下拉框選擇初始過濾Key的類型,單擊向左箭頭表徵圖。

        初始過濾Key的類型:

        • params[n]:方法的第n個參數。

        • returnObj:方法的傳回值。

        • 方法執行耗時:方法執行的耗時。

        • 是否拋出異常:方法執行時是否拋出異常。

        說明

        如果選取的初始過濾Key為巢狀型別,則還需要繼續選擇該巢狀型別的內部欄位,直到選擇欄位為基礎類型。

      3. 選擇過濾條件。

      4. 輸入過濾值。

      5. 單擊添加

        當前過濾條件地區會顯示已添加的過濾條件。

        例如選擇重載方法doGetDatas(ArmsCtx, String),設定當前過濾key為params[0].userId,選擇過濾條件為=,填入過濾值123,單擊添加後,當前過濾條件地區顯示已配置的條件(如params.length = 2、params[0].userId = 123)。

      6. 在左側執行堆棧地區右上方單擊重新整理表徵圖,系統會按照設定的條件重新抓取一次方法執行。

對象查看器

對象查看器用於查看一些單例對象當前的狀態,用於排查應用狀態異常問題,例如應用配置、黑白名單、成員變數等。

  1. 在Arthas診斷頁面,單擊对象查看器頁簽。

  2. 对象查看器頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊搜索表徵圖。

  3. 在搜尋到的類中選擇需要診斷的類,然後在右側執行個體選擇框選擇該類的某個執行個體,單擊确定

    頁面則會顯示該執行個體中當前欄位的即時取值。頁面分為左側對象欄位即時取值地區(表格顯示類型、欄位名和詳情列)和右側欄位詳情地區(展示選中欄位的詳細JSON資料)。

    • 對於簡單類型的欄位,在左側对象字段实时取值地區的详情列會是欄位的取值。

    • 對於複製類型的欄位,在左側对象字段实时取值地區的详情列單擊点击查看详情,在右側字段详情地區查看欄位取值詳情。

      字段详情地區僅支援將複雜類型欄位還原序列化一層進行展示,如果需要查看更具體的資料,單擊點擊查看欄位更詳細的資料。

即時看板

即時看板用於查看系統中用到的關鍵組件的即時狀態,例如查看資料庫連接池的使用方式、HTTP串連池的使用方式等,有利於排查資源類型的問題。

  1. 在Arthas診斷頁面,單擊实时看板頁簽。

  2. 实时看板頁簽的下拉式清單中選擇一個看板,然後在右側執行個體選擇框選擇該看板的一個執行個體,單擊添加到看板

    頁面顯示該看板的即時情況。以Druid串連池為例,即時狀態資訊包括基礎配置、串連池狀態、執行耗時分布等。其中基礎配置包括DbTypeURL等,串連池狀態包括ActiveCountPoolingCountMaxActive等指標,下方以柱狀圖展示connection佔用耗時分布事務執行耗時分布

效能分析

效能分析支援對CPU耗時、記憶體配置等對象進行一定時間的採樣並產生相應的火焰圖,協助您快速定位應用的效能瓶頸。

  1. 在Arthas診斷頁面,單擊性能分析頁簽。

  2. 性能分析頁簽下方,單擊新建火焰圖

  3. 新建火焰圖對話方塊,選擇火焰圖類型,輸入採樣時間和備忘資訊,然後單擊确认

    參數

    描述

    樣本值

    火焰圖類型

    採樣對象的類型。取值:

    • cpu耗時

    • 記憶體配置

    • 鎖耗時

    • itimer

    cpu耗時

    輸入採樣時間(單位:秒)

    採樣的時間長度。取值:10~1800。

    30

    性能分析頁簽下方顯示已建立的火焰圖的任務資訊,包括開始時間、採樣時間、備忘資訊、火焰圖類型和任務狀態。任務完成後,任務狀態列將顯示查看火焰圖連結,可點擊查看產生的火焰圖。

  4. 性能分析頁簽下方,找到任務記錄,在其右側任务状态,單擊查看火焰圖,根據頁面提示下載SVG格式的火焰圖檔案,然後在瀏覽器中開啟。

    火焰圖

Arthas Shell

通過命令列方式自訂Arthas診斷。

Arthas Shell頁面頂部提供線路選擇和串連/斷開按鈕,串連成功後顯示綠色已串連狀態提示,下方為黑色終端介面,顯示Arthas命令列提示符(如[arthas@9]$),您可以在此輸入Arthas命令進行診斷操作。

常見問題

Arthas開啟後無提示無心跳

出現這種情況可能存在以下兩個原因:

  • 網路不通。

    檢測網路連通性,若公網應用診斷連接埠(9092)和內網應用診斷連接埠(9092)同時失敗,則需要在網路安全性群組中開啟應用診斷網域名稱的9092連接埠出方向存取權限以及對應地區的存取點網域名稱。需要開放的網域名稱請參見Java應用監控網路設定,其中應用診斷網域名稱與調用鏈中繼資料網域名稱一致。

  • 應用掛載了 SkyWalking 探針。

    目前 ARMS 整合的 Arthas 和 SkyWalking 不相容,無法同時存在,需要卸載 SkyWalking 探針或者自行掛載高版本 Arthas(3.7.0及以上版本)。

    執行cat ~/logs/arthas/arthas.log命令,在日誌結尾處可以看到探針不相容的異常資訊。

    2023-09-11 09:09:47 [arthas-binding-thread] ERROR c.t.a.core.server.ArthasBootstrap -start channel client failure
    java.lang.ExceptionInInitializerError: null
    	at com.alibaba.arthas.channel.proto.ArthasServiceGrpc$ArthasServiceStub.register(ArthasServiceGrpc.java:306)
    	at com.alibaba.arthas.channel.client.ChannelClient.connect(ChannelClient.java:165)
    	at com.alibaba.arthas.channel.client.ChannelClient.start(ChannelClient.java:111)
    	at com.taobao.arthas.core.server.ArthasBootstrap.bind(ArthasBootstrap.java:478)
    	at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:162)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:613)
    	at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:601)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:182)
    	at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20)
    	at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:152)
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at io.grpc.stub.ClientCalls.<clinit>(ClientCalls.java:52)
    	... 14 common frames omitted
    Caused by: java.lang.reflect.InvocationTargetException: null
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:139)
    	... 19 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: Lorg/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter;
    	at java.lang.Class.getDeclaredFields0(Native Method)
    	at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    	at java.lang.Class.getDeclaredField(Class.java:2068)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:163)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:233)
    	at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3655)
    	... 24 common frames omitted
    Caused by: java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at com.taobao.arthas.agent.ArthasClassloader.loadClass(ArthasClassloader.java:34)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	... 30 common frames omitted
    

方法執行分析頁簽轉圈一段時間後提示命令執行失敗

此時方法執行分析頁面左側執行堆棧地區顯示載入動畫和等待提示,表示系統正在等待方法被調用。

方法執行分析是即時抓取使用者當前選擇的方法執行情況,如果在等待的時間內,指定的方法並沒有執行,就會出現該錯誤。可以單擊右側重新整理表徵圖重試。

Arthas展示的survivor_space空間為實際值的一半

Survivor_space分為from和to兩部分,兩者各佔一半。Arthas只展示了from區的大小。

Arthas診斷額外收費嗎

不額外收費。

ARMS控制台開啟Arthas後,手動掛載Arthas提示串連拒絕

Arthas預設使用3658連接埠來接收新的串連用戶端,ARMS整合的Arthas為了避免一台機器上的多個進程同時掛載Arthas時出現連接埠衝突,使用的是隨機連接埠,所以會出現掛載失敗的問題,出現這種情況需要在ARMS控制台關閉Arthas功能。

ARMS控制台開啟Arthas後,日誌裡面提示Arthas server already bind.

如果應用之前掛載過開源的Arthas,則ARMS Arthas不支援重複開啟,需要先刪除開源的Arthas,再開啟ARMS的Arthas。