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診斷功能
-
登入ARMS控制台,在左側導覽列選擇。
-
在应用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。
說明语言列的表徵圖含義如下:
:接入應用監控的Java應用。
:接入應用監控的Golang應用。
:接入應用監控的Python應用。-:接入可觀測鏈路 OpenTelemetry 版的應用。
-
在上方導覽列選擇。
-
在Arthas监控地區,開啟Arthas開關,根據需求選擇是否僅對部分IP進行Arthas診斷,並添加目標IP。
-
單擊保存。
查看Arthas診斷資訊
-
登入ARMS控制台,在左側導覽列選擇。
-
在应用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。
說明语言列的表徵圖含義如下:
:接入應用監控的Java應用。
:接入應用監控的Golang應用。
:接入應用監控的Python應用。-:接入Managed Service for OpenTelemetry的應用。
-
在上方導覽列選擇。
-
在Arthas診斷頁面頂部下拉式清單選擇待診斷的應用執行個體。
-
若該執行個體的Agent版本未升級至2.7.1.3或以上,頁面會提示您需要先升級Agent。
-
若該執行個體的Agent版本已升級至2.7.1.3或以上,頁面會顯示該執行個體的Arthas診斷資訊。
-
JVM概覽
JVM概覽支援查看應用的JVM相關資訊,包括JVM記憶體、作業系統資訊、變數資訊等,協助您瞭解JVM的總體情況。
Arthas診斷頁面預設顯示JVM概览頁簽,您可以在JVM概览頁簽查看以下資訊:
-
JVM内存:JVM記憶體的相關資訊,包括堆記憶體使用量情況、非堆記憶體使用量情況、GC情況等。其中表格以heap、buffer_pool和nonheap分類展示各記憶體地區的已使用量、總量、最大量以及GC類型對應的總次數和總耗時。
-
操作系统信息:作業系統的相關資訊,包括平均負載情況,作業系統名稱、作業系統版本、Java版本等。具體欄位包括systemLoadAverage、osVersion、javaVersion、processors、osName、javaHome、timestamp和uptime。
-
变量信息:變數的相關資訊,包括系統變數和環境變數。頁面分為左側系統變數和右側環境變數兩個面板,各提供搜尋方塊可按關鍵字篩選,以索引值對形式展示變數名稱和取值。
線程耗時分析
線程耗時分析支援顯示該應用的所有線程和查看線程的堆棧資訊,協助您快速定位耗時較高的線程。
-
在Arthas診斷頁面,單擊线程耗时分析頁簽。
线程耗时分析頁簽會即時擷取當前JVM進程的線程耗時情況,並將相似線程彙總。頁面頂部顯示各狀態線程數(NEW、TERMINATED、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING),下方表格以Name、總CPU、數量為列彙總展示線程,展開可查看各線程的ID、CPU使用率、State和查看即時堆棧操作入口。
-
單擊線程左側的+表徵圖展開線程明細,可以查看線程的ID、CPU使用率和狀態。
-
如需查看目標線程的堆棧資訊,您可以在目標線程右側的操作列,單擊查看实时堆栈。
彈出線程詳情對話方塊,顯示線程名稱、狀態(如RUNNABLE)以及完整的Java堆棧資訊。
方法執行分析
方法執行分析支援抓取方法的某一次執行的耗時、入參、傳回值等資訊和鑽入,協助您快速定位導致慢調用的根本原因,以及問題線下無法複現或日誌缺失等情境。
-
在Arthas診斷頁面,單擊方法执行分析頁簽。
-
在方法执行分析頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊
表徵圖。 -
在搜尋到的類中選擇需要診斷的類,然後在右側方法選擇框選取該類的某個方法,單擊确定。
頁面將會顯示ARMS隨機抓取的該方法的某一次執行的資訊。
-
左側執行堆棧地區顯示診斷方法的內部執行記錄。
-
如需鑽入某個內部方法,在其右側操作列,單擊钻入。
-
如需查看方法源碼,單擊執行堆棧地區頂部的查看方法源碼。
每一次內部方法的執行耗時都會以注釋的方式顯示在原始碼中。
-
-
右側方法執行結果地區顯示方法執行的參數值、傳回值、異常、成員變數以及此次方法執行的TraceID。
-
右側設定執行條件地區執行以下步驟,可以設定方法執行條件來抓取滿足條件的方法執行記錄。
-
選擇當前方法中的一個重載方法。
-
在請選擇初始過濾key下拉框選擇初始過濾Key的類型,單擊
表徵圖。初始過濾Key的類型:
-
params[n]:方法的第n個參數。
-
returnObj:方法的傳回值。
-
方法執行耗時:方法執行的耗時。
-
是否拋出異常:方法執行時是否拋出異常。
說明如果選取的初始過濾Key為巢狀型別,則還需要繼續選擇該巢狀型別的內部欄位,直到選擇欄位為基礎類型。
-
-
選擇過濾條件。
-
輸入過濾值。
-
單擊添加。
在當前過濾條件地區會顯示已添加的過濾條件。
例如選擇重載方法doGetDatas(ArmsCtx, String),設定當前過濾key為params[0].userId,選擇過濾條件為=,填入過濾值123,單擊添加後,當前過濾條件地區顯示已配置的條件(如params.length = 2、params[0].userId = 123)。
-
在左側執行堆棧地區右上方單擊
表徵圖,系統會按照設定的條件重新抓取一次方法執行。
-
-
對象查看器
對象查看器用於查看一些單例對象當前的狀態,用於排查應用狀態異常問題,例如應用配置、黑白名單、成員變數等。
-
在Arthas診斷頁面,單擊对象查看器頁簽。
-
在对象查看器頁簽的搜尋方塊中輸入類名的關鍵詞,然後單擊搜索表徵圖。
-
在搜尋到的類中選擇需要診斷的類,然後在右側執行個體選擇框選擇該類的某個執行個體,單擊确定。
頁面則會顯示該執行個體中當前欄位的即時取值。頁面分為左側對象欄位即時取值地區(表格顯示類型、欄位名和詳情列)和右側欄位詳情地區(展示選中欄位的詳細JSON資料)。
-
對於簡單類型的欄位,在左側对象字段实时取值地區的详情列會是欄位的取值。
-
對於複製類型的欄位,在左側对象字段实时取值地區的详情列單擊点击查看详情,在右側字段详情地區查看欄位取值詳情。
字段详情地區僅支援將複雜類型欄位還原序列化一層進行展示,如果需要查看更具體的資料,單擊點擊查看欄位更詳細的資料。
-
即時看板
即時看板用於查看系統中用到的關鍵組件的即時狀態,例如查看資料庫連接池的使用方式、HTTP串連池的使用方式等,有利於排查資源類型的問題。
-
在Arthas診斷頁面,單擊实时看板頁簽。
-
在实时看板頁簽的下拉式清單中選擇一個看板,然後在右側執行個體選擇框選擇該看板的一個執行個體,單擊添加到看板。
頁面顯示該看板的即時情況。以Druid串連池為例,即時狀態資訊包括基礎配置、串連池狀態、執行耗時分布等。其中基礎配置包括DbType、URL等,串連池狀態包括ActiveCount、PoolingCount、MaxActive等指標,下方以柱狀圖展示connection佔用耗時分布和事務執行耗時分布。
效能分析
效能分析支援對CPU耗時、記憶體配置等對象進行一定時間的採樣並產生相應的火焰圖,協助您快速定位應用的效能瓶頸。
-
在Arthas診斷頁面,單擊性能分析頁簽。
-
在性能分析頁簽下方,單擊新建火焰圖。
-
在新建火焰圖對話方塊,選擇火焰圖類型,輸入採樣時間和備忘資訊,然後單擊确认。
參數
描述
樣本值
火焰圖類型
採樣對象的類型。取值:
-
cpu耗時
-
記憶體配置
-
鎖耗時
-
itimer
cpu耗時
輸入採樣時間(單位:秒)
採樣的時間長度。取值:10~1800。
30
性能分析頁簽下方顯示已建立的火焰圖的任務資訊,包括開始時間、採樣時間、備忘資訊、火焰圖類型和任務狀態。任務完成後,任務狀態列將顯示查看火焰圖連結,可點擊查看產生的火焰圖。
-
-
在性能分析頁簽下方,找到任務記錄,在其右側任务状态,單擊查看火焰圖,根據頁面提示下載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。