日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

實戰(zhàn)Arthas:常見命令與優(yōu)秀實踐

來源: 責(zé)編: 時間:2024-01-23 17:23:24 254觀看
導(dǎo)讀當(dāng)涉及到 Java 應(yīng)用程序的診斷和調(diào)優(yōu)時,Arthas 是一款備受推崇的開源工具,無論是線上問題的定位,還是實時性能監(jiān)控和分析,Arthas 都能為您提供強大的支持。本文將介紹 Arthas 的常用命令和使用技巧,幫助您更好地利用該工具

當(dāng)涉及到 Java 應(yīng)用程序的診斷和調(diào)優(yōu)時,Arthas 是一款備受推崇的開源工具,無論是線上問題的定位,還是實時性能監(jiān)控和分析,Arthas 都能為您提供強大的支持。g6c28資訊網(wǎng)——每日最新資訊28at.com

本文將介紹 Arthas 的常用命令和使用技巧,幫助您更好地利用該工具進行故障排查和性能優(yōu)化。g6c28資訊網(wǎng)——每日最新資訊28at.com

g6c28資訊網(wǎng)——每日最新資訊28at.com

一、前言

在開始本文之前,先推薦兩個東西:g6c28資訊網(wǎng)——每日最新資訊28at.com

一個是 Arthas 官網(wǎng):https://arthas.aliyun.com/doc/,官方文檔對 Arthas 的每個命令都做出了介紹和解釋,并且還有在線教程,方便大家學(xué)習(xí)和熟悉命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

g6c28資訊網(wǎng)——每日最新資訊28at.com

另外還有一個向大家推薦的是一款名為 Arthas Idea 的 IDEA 插件。g6c28資訊網(wǎng)——每日最新資訊28at.com

這是一款能快速生成 Arthas命令的插件,可快速生成可用于該類或該方法的 Arthas 命令,大大提高排查問題的效率。g6c28資訊網(wǎng)——每日最新資訊28at.com

g6c28資訊網(wǎng)——每日最新資訊28at.com

二、常用命令

盡管 Arthas 命令眾多,但在實際使用中我們只需聚焦于那些常用命令。本文旨在重點介紹這些常用命令,并提供使用技巧和最佳實踐,幫助您更好地運用 Arthas。g6c28資訊網(wǎng)——每日最新資訊28at.com

1.類命令

(1) getstatic

查看類的靜態(tài)屬性。推薦直接使用 ognl 命令,更加靈活。g6c28資訊網(wǎng)——每日最新資訊28at.com

# getstatic class_name field_namegetstatic demo.MathGame random# 如果該靜態(tài)屬性是一個復(fù)雜對象,還可以支持在該屬性上通過 ognl 表達式進行遍歷,過濾,訪問對象的內(nèi)部屬性等操作。# 例如,假設(shè) n 是一個 Map,Map 的 Key 是一個 Enum,我們想過濾出 Map 中 Key 為某個 Enum 的值,可以寫如下命令getstatic com.alibaba.arthas.Test n 'entrySet().iterator.{? #this.key.name()=="STOP"}'

(2) jadg6c28資訊網(wǎng)——每日最新資訊28at.com

反編譯指定已加載類的源碼。jad 只能反編譯單個類,如需批量下載指定包的目錄的 class 字節(jié)碼請使用 dump 命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

比如我們想知道自己提交的代碼是否生效了,這種場景jad 命令就特別有用。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 反編譯 java.lang.Stringjad java.lang.String# 默認情況下,反編譯結(jié)果里會帶有 ClassLoader 信息,通過 --source-only 選項,可以只打印源代碼。方便和 mc/retransform 命令結(jié)合使用。jad --source-only java.lang.String# 反編譯指定的函數(shù)jad java.lang.String substring# 當(dāng)有多個 ClassLoader 都加載了這個類時,jad 命令會輸出對應(yīng) ClassLoader 實例的 hashcode# 然后你只需要重新執(zhí)行 jad 命令,并使用參數(shù) -c <hashcode> 就可以反編譯指定 ClassLoader 加載的那個類了jad org.apache.log4j.Logger -c 69dcaba4

(3) retransformg6c28資訊網(wǎng)——每日最新資訊28at.com

加載外部的 .class 文件,retransform jvm 已加載的類。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 結(jié)合 jad/mc 命令使用,jad 命令反編譯,然后可以用其它編譯器,比如 vim 來修改源碼jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java# mc 命令來內(nèi)存編譯修改過的代碼mc /tmp/UserController.java -d /tmp# 用 retransform 命令加載新的字節(jié)碼retransform /tmp/com/example/demo/arthas/user/UserController.class

加載指定的 .class 文件,然后解析出 class name,再 retransform jvm 中已加載的對應(yīng)的類。每加載一個 .class 文件,則會記錄一個 retransform entry。g6c28資訊網(wǎng)——每日最新資訊28at.com

如果多次執(zhí)行 retransform 加載同一個 class 文件,則會有多條 retransform entry。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 查看 retransform entryretransform -l# 刪除指定 retransform entry,需要指定 id:retransform -d 1# 刪除所有 retransform entryretransform --deleteAll# 顯式觸發(fā) retransformretransform --classPattern demo.MathGame

如果對某個類執(zhí)行 retransform 之后,想消除 retransform 的影響,則需要:g6c28資訊網(wǎng)——每日最新資訊28at.com

  • 刪除這個類對應(yīng)的 retransform entry。
  • 重新顯式觸發(fā) retransform。

retransform 的限制:g6c28資訊網(wǎng)——每日最新資訊28at.com

  • 不允許新增加 field/method。
  • 正在跑的函數(shù),沒有退出不能生效。

使用 mc 命令來編譯 jad 的反編譯的代碼有可能失敗。可以在本地修改代碼,編譯好后再上傳到服務(wù)器上。有的服務(wù)器不允許直接上傳文件,可以使用 base64 命令來繞過。g6c28資訊網(wǎng)——每日最新資訊28at.com

  • 在本地先轉(zhuǎn)換 .class 文件為 base64,再保存為 result.txt。
base64  -i /tmp/test.class -o /tmp/result.txt
  • 到服務(wù)器上,新建并編輯 result.txt,復(fù)制本地的內(nèi)容,粘貼再保存。
vim  /tmp/result.txt
  • 把服務(wù)器上的 result.txt 還原為.class。
base64 -d /tmp/result.txt > /tmp/test.class
  • 用 md5 命令計算哈希值,校驗是否一致。
md5sum  /tmp/test.class

2.監(jiān)測排查命令

監(jiān)測排查命令是 Arthas 中最常用的命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

請注意,這些命令,都通過字節(jié)碼增強技術(shù)來實現(xiàn)的,會在指定類的方法中插入一些切面來實現(xiàn)數(shù)據(jù)統(tǒng)計和觀測,因此在線上、預(yù)發(fā)使用時,請盡量明確需要觀測的類、方法以及條件,診斷結(jié)束要執(zhí)行 stop 或?qū)⒃鰪娺^的類執(zhí)行 reset 命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

(1) monitor

方法執(zhí)行監(jiān)控。可對方法的調(diào)用次數(shù),成功次數(shù),失敗次數(shù)等維度進行統(tǒng)計。g6c28資訊網(wǎng)——每日最新資訊28at.com

# -b:計算條件表達式過濾統(tǒng)計結(jié)果(方法執(zhí)行完畢之前),默認是方法執(zhí)行之后過濾# -c:統(tǒng)計周期,默認值為 120 秒# params[0] <= 2:過濾條件,方法第一個參數(shù)小于等于2monitor -b -c 5 com.test.testes.MathGame primeFactors "params[0] <= 2"

(2) stack

輸出當(dāng)前方法被調(diào)用的調(diào)用路徑。g6c28資訊網(wǎng)——每日最新資訊28at.com

很多時候我們都知道一個方法被執(zhí)行,但這個方法被執(zhí)行的路徑非常多,或者你根本就不知道這個方法是從那里被執(zhí)行了,此時你需要的是 stack 命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

# -n:執(zhí)行次數(shù)stack demo.MathGame primeFactors  -n  2

(3) thread

查看當(dāng)前線程信息,查看線程的堆棧。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 沒有參數(shù)時,默認按照 CPU 增量時間降序排列,只顯示第一頁數(shù)據(jù)# -i 1000: 統(tǒng)計最近 1000ms 內(nèi)的線程 CPU 時間# -n 3: 展示當(dāng)前最忙的前 N 個線程并打印堆棧# --state WAITING:查看指定狀態(tài)的線程thread# 顯示指定線程的運行堆棧thread id# 找出當(dāng)前阻塞其他線程的線程,注意,目前只支持找出 synchronized 關(guān)鍵字阻塞住的線程, 如果是 java.util.concurrent.Lock 目前還不支持。thread -b

輸出:g6c28資訊網(wǎng)——每日最新資訊28at.com

  • Internal 表示為 JVM 內(nèi)部線程,參考 dashboard 命令的介紹。
  • cpuUsage 為采樣間隔時間內(nèi)線程的 CPU 使用率,與 dashboard 命令的數(shù)據(jù)一致。
  • deltaTime 為采樣間隔時間內(nèi)線程的增量 CPU 時間,小于 1ms 時被取整顯示為 0ms。
  • time 為線程運行總 CPU 時間。

(4) traceg6c28資訊網(wǎng)——每日最新資訊28at.com

方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個節(jié)點上耗時。g6c28資訊網(wǎng)——每日最新資訊28at.com

trace 命令在定位性能問題的時候特別有用。g6c28資訊網(wǎng)——每日最新資訊28at.com

# -n 1:限制匹配次數(shù)# --skipJDKMethod false:默認情況下,trace 不會包含 jdk 里的函數(shù)調(diào)用,如果希望 trace jdk 里的函數(shù),需要顯式設(shè)置# --exclude-class-pattern :排除掉指定的類trace javax.servlet.Filter * -n 1 --skipJDKMethod false --exclude-class-pattern com.demo.TestFilter# 正則表達式匹配路徑上的多個類和函數(shù),達到多層 trace 的效果trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

動態(tài) tradce參考:https://arthas.aliyun.com/doc/trace.html#動態(tài)-traceg6c28資訊網(wǎng)——每日最新資訊28at.com

(5) ttg6c28資訊網(wǎng)——每日最新資訊28at.com

方法執(zhí)行數(shù)據(jù)的時空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔ⅲ⒛軐@些不同的時間下調(diào)用進行觀測。g6c28資訊網(wǎng)——每日最新資訊28at.com

說明:g6c28資訊網(wǎng)——每日最新資訊28at.com

  • tt 命令的實現(xiàn)是:把函數(shù)的入?yún)?返回值等,保存到一個Map<Integer, TimeFragment>里,默認的大小是 100。
  • tt 相關(guān)功能在使用完之后,需要手動釋放內(nèi)存,否則長時間可能導(dǎo)致 OOM。退出 arthas 不會自動清除 tt 的緩存 map。
  • 需要強調(diào)的是,tt 命令是將當(dāng)前環(huán)境的對象引用保存起來,但僅僅也只能保存一個引用而已。如果方法內(nèi)部對入?yún)⑦M行了變更,或者返回的對象經(jīng)過了后續(xù)的處理,那么在  tt  查看的時候?qū)o法看到當(dāng)時最準(zhǔn)確的值。這也是為什么 watch 命令存在的意義。
# -l:顯示tt記錄tt -l# -s:檢索tt記錄,比如:-s 'method.name=="primeFactors"'tt -s 'method.name=="primeFactors"'# -t:這個參數(shù)的表明希望記錄下類 *Test 的 print 方法的每次執(zhí)行情況。tt -t# 查看具體調(diào)用信息tt -i 1003# -w:--watch-express 觀察時空隧道使用 ognl 表達式tt -w '@demo.MathGame@random.nextInt(100)'# 重做一次調(diào)用,當(dāng)我們對程序做出了修改之后,希望再次調(diào)用觀測結(jié)果,此時你需要 -p 參數(shù)# --replay-times:指定調(diào)用次數(shù)# --replay-interval:指定多次調(diào)用間隔(單位 ms, 默認 1000ms)tt -i 1004 -p# 通過索引刪除指定的 tt 記錄tt -d 1001# 清除所有的 tt 記錄tt --delete-all

Spring MVC里獲取對于的 bean:g6c28資訊網(wǎng)——每日最新資訊28at.com

# 獲取Spring Context里的beantt -n 1 -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethodtt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'

(6) watch

函數(shù)執(zhí)行數(shù)據(jù)觀測,通過編寫 OGNL 表達式進行對應(yīng)變量的查看。g6c28資訊網(wǎng)——每日最新資訊28at.com

  • watch 命令定義了 4 個觀察事件點,即 -b 函數(shù)調(diào)用前,-e 函數(shù)異常后,-s 函數(shù)返回后,-f 函數(shù)結(jié)束后。
  • 4 個觀察事件點 -b、-e、-s 默認關(guān)閉,-f 默認打開,當(dāng)指定觀察點被打開后,在相應(yīng)事件點會對觀察表達式進行求值并輸出。
  • 這里要注意函數(shù)入?yún)⒑秃瘮?shù)出參的區(qū)別,有可能在中間被修改導(dǎo)致前后不一致,除了 -b 事件點 params 代表函數(shù)入?yún)⑼猓溆嗍录即砗瘮?shù)出參。
  • 當(dāng)使用 -b 時,由于觀察事件點是在函數(shù)調(diào)用前,此時返回值或異常均不存在。
  • 在 watch 命令的結(jié)果里,會打印出location信息。location有三種可能值:AtEnter,AtExit,AtExceptionExit。對應(yīng)函數(shù)入口,函數(shù)正常 return,函數(shù)拋出異常。
# -x表示遍歷深度,可以調(diào)整來打印具體的參數(shù)和結(jié)果內(nèi)容,默認值是 1。 # -x最大值是 4,防止展開結(jié)果占用太多內(nèi)存。用戶可以在ognl表達式里指定更具體的 field。 watch demo.MathGame primeFactors -x 3  # 可以使用ognl表達式進行條件過濾 watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" "#cost>200"  # 可以使用 target.field_name 訪問當(dāng)前對象的某個屬性 watch demo.MathGame primeFactors 'target.illegalArgumentCount'  #  watch 構(gòu)造函數(shù) watch demo.MathGame <init> '{params,returnObj,throwExp}' -v  # watch內(nèi)部類 watch OuterClass$InnerClass

3.JVM命令

(1) heapdump

生成堆轉(zhuǎn)儲文件。g6c28資訊網(wǎng)——每日最新資訊28at.com

# dump 到指定文件heapdump arthas-output/dump.hprof# 只 dump live 對象heapdump --live /tmp/dump.hprof

(2) jfr

Java Flight Recorder (JFR) 是一種用于收集有關(guān)正在運行的 Java 應(yīng)用程序的診斷和分析數(shù)據(jù)的工具。g6c28資訊網(wǎng)——每日最新資訊28at.com

它集成到 Java 虛擬機 (JVM) 中,幾乎不會造成性能開銷,因此即使在負載較重的生產(chǎn)環(huán)境中也可以使用。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 啟動 JFR 記錄jfr start# 啟動 jfr 記錄,指定記錄名,記錄持續(xù)時間,記錄文件保存路徑。# --duration  JFR 記錄持續(xù)時間,支持單位配置,60s, 2m, 5h, 3d,不帶單位就是秒,默認一直記錄。jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr# 查看所有 JFR 記錄信息jfr status# 查看指定記錄 id 的記錄信息jfr status -r 1# 查看指定狀態(tài)的記錄信息jfr status --state closed# jfr dump 會輸出從開始到運行該命令這段時間內(nèi)的記錄到 JFR 文件,且不會停止 jfr 的記錄# 生成的結(jié)果可以用支持 jfr 格式的工具來查看。比如:JDK Mission Control : https://github.com/openjdk/jmcjfr dump -r 1 -f /tmp/myRecording1.jfr# 停止 jfr 記錄jfr stop -r 1

(3) memory

查看 JVM 內(nèi)存信息。g6c28資訊網(wǎng)——每日最新資訊28at.com

輸出如下:g6c28資訊網(wǎng)——每日最新資訊28at.com

Memory                           used      total      max        usageheap                             32M       256M       4096M      0.79%g1_eden_space                    11M       68M        -1         16.18%g1_old_gen                       17M       184M       4096M      0.43%g1_survivor_space                4M        4M         -1         100.00%nonheap                          35M       39M        -1         89.55%codeheap_'non-nmethods'          1M        2M         5M         20.53%metaspace                        26M       27M        -1         96.88%codeheap_'profiled_nmethods'     4M        4M         117M       3.57%compressed_class_space           2M        3M         1024M      0.29%codeheap_'non-profiled_nmethods' 685K      2496K      120032K    0.57%mapped                           0K        0K         -          0.00%direct                           48M       48M        -          100.00%

(4) dashboard

當(dāng)前系統(tǒng)的實時數(shù)據(jù)面板,按 ctrl+c 退出。g6c28資訊網(wǎng)——每日最新資訊28at.com

# i:刷新實時數(shù)據(jù)的時間間隔 (ms),默認 5000m# n:刷新實時數(shù)據(jù)的次數(shù)dashboard -i 5000 -n 3

顯示 ID 為 -1 的是 JVM的內(nèi)部線程,JVM 內(nèi)部線程包括下面幾種:g6c28資訊網(wǎng)——每日最新資訊28at.com

  • JIT 編譯線程:如  C1 CompilerThread0, C2 CompilerThread0。
  • GC 線程:如 GC Thread0, G1 Young RemSet Sampling。
  • 其它內(nèi)部線程:如 VM Periodic Task Thread, VM Thread, Service Thread。

當(dāng) JVM 堆(heap)/元數(shù)據(jù)(metaspace) 空間不足或 OOM 時, GC 線程的 CPU 占用率會明顯高于其他的線程。g6c28資訊網(wǎng)——每日最新資訊28at.com

(5) classloader

classloader 命令將 JVM 中所有的 classloader 的信息統(tǒng)計出來,并可以展示繼承樹,urls 等。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 按類加載類型查看統(tǒng)計信息classloader# 按類加載實例查看統(tǒng)計信息classloader -l# 查看 ClassLoader 的繼承樹classloader -t# 查看 URLClassLoader 實際的 urls,通過 classloader -l 可以獲取到哈希值classloader -c 3d4eac69

(6) logger

查看 logger 信息,更新 logger level。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 查看所有 logger 信息logger# 查看指定名字的 logger 信息logger -n org.springframework.web# 更新 logger levellogger --name ROOT --level debug

(7) sc

查看 JVM 已加載的類信息。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 模糊搜索sc demo.*# 打印類的詳細信息sc -d demo.MathGame# 打印出類的 Field 信息sc -d -f demo.MathGame

(8) mbean

查看 Mbean 的信息。g6c28資訊網(wǎng)——每日最新資訊28at.com

所謂 MBean 就是托管的Java對象,類似于 JavaBeans 組件,遵循 JMX(Java Management Extensions,即Java管理擴展) 規(guī)范中規(guī)定的設(shè)計模式。g6c28資訊網(wǎng)——每日最新資訊28at.com

MBean可以表示任何需要管理的資源。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 列出所有 Mbean 的名稱mbean# 查看 Mbean 的元信息mbean -m java.lang:type=Threading# 查看 mbean 屬性信息,mbean 的 name 支持通配符匹配 mbean java.lang:type=Th*mbean java.lang:type=Threading#通配符匹配特定的屬性字段mbean java.lang:type=Threading *Count# 實時監(jiān)控使用-i,使用-n命令執(zhí)行命令的次數(shù)(默認為 100 次)mbean -i 1000 -n 50 java.lang:type=Threading *Count

比如我們可以使用 mbean 命令來查看 Druid 連接池的屬性:g6c28資訊網(wǎng)——每日最新資訊28at.com

mbean com.alibaba.druid.pool:name=dataSource,type=DruidDataSource

(9) profiler

生成應(yīng)用熱點的火焰圖。本質(zhì)上是通過不斷的采樣,然后把收集到的采樣結(jié)果生成火焰圖。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 啟動 profiler# 生成的是 cpu 的火焰圖,即 event 為cpu。可以用--event參數(shù)來指定。profiler start --event cpu# 獲取已采集的 sample 的數(shù)量profiler getSamples# 查看 profiler 狀態(tài)profiler status# 停止 profiler,生成結(jié)果,結(jié)果文件是html格式,也可以用--format參數(shù)指定profiler stop --format html# 恢復(fù)采樣,start和resume的區(qū)別是:start是新開始采樣,resume會保留上次stop時的數(shù)據(jù)。profiler resume# 配置 include/exclude 來過濾數(shù)據(jù)profiler start --include 'java/*' --include 'demo/*' --exclude '*Unsafe.park*'# 生成 jfr 格式結(jié)果profiler start --file /tmp/test.jfr

(10) vmoption

查看,更新 VM 診斷相關(guān)的參數(shù)。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 查看所有的 optionvmoption# 查看指定的 optionvmoption PrintGC# 更新指定的 optionvmoption PrintGC true

(11) vmtool

vmtool  利用 JVMTI 接口,實現(xiàn)查詢內(nèi)存對象,強制 GC 等功能。g6c28資訊網(wǎng)——每日最新資訊28at.com

# --limit:可以限制返回值數(shù)量,避免獲取超大數(shù)據(jù)時對 JVM 造成壓力。默認值是 10# --action:執(zhí)行的動作vmtool --action getInstances --className java.lang.String --limit 10#強制 GCvmtool --action forceGc# interrupt 指定線程vmtool --action interruptThread -t 1

4.特殊命令

可以使用 -v  查看觀察匹配表達式的執(zhí)行結(jié)果g6c28資訊網(wǎng)——每日最新資訊28at.com

(1) ognl

執(zhí)行 ognl 表達式,是Arthas中最為靈活的命令。g6c28資訊網(wǎng)——每日最新資訊28at.com

# -c:執(zhí)行表達式的 ClassLoader 的 hashcode,默認值是 SystemClassLoader# --classLoaderClass:指定執(zhí)行表達式的 ClassLoader 的 class name# -x:結(jié)果對象的展開層次,默認值 1ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger

有關(guān) ognl 語法介紹,放在下文。g6c28資訊網(wǎng)——每日最新資訊28at.com

(2) options

全局開關(guān),慎用!g6c28資訊網(wǎng)——每日最新資訊28at.com

# 查看所有的 optionsoptions# 設(shè)置指定的 option,默認情況下json-format為 false,如果希望watch/tt等命令結(jié)果以 json 格式輸出,則可以設(shè)置json-format為 true。options json-format true# 默認情況下,watch/trace/tt/trace/monitor等命令不支持java.* package 下的類。可以設(shè)置unsafe為 true,則可以增強。options unsafe true# Arthas 默認啟用strict模式,在ognl表達式里,禁止更新對象的 Property 或者調(diào)用setter函數(shù)# 用戶如果確定要在ognl表達式里更新對象,可以執(zhí)行options strict false,關(guān)閉strict模式。options strict false

5.幫助命令

(1) help

查看命令幫助信息,可以查看當(dāng)前 arthas 版本支持的指令,或者查看具體指令的使用說明。g6c28資訊網(wǎng)——每日最新資訊28at.com

help dashboard 或者dashboard  -help

(2) history

打印命令歷史。g6c28資訊網(wǎng)——每日最新資訊28at.com

#查看最近執(zhí)行的3條指令history 3#清空指令history -c

(3) cls

清空當(dāng)前屏幕區(qū)域。g6c28資訊網(wǎng)——每日最新資訊28at.com

(4) quit

僅退出當(dāng)前的連接,Attach 到目標(biāo)進程上的 arthas 還會繼續(xù)運行,端口會保持開放,下次連接時可以直接連接上。或者直接按 Q 也能退出。g6c28資訊網(wǎng)——每日最新資訊28at.com

(5) stop

完全退出 arthas,stop 時會重置所有增強過的類。g6c28資訊網(wǎng)——每日最新資訊28at.com

(6) reset

重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務(wù)端 stop 時會重置所有增強過的類。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 還原指定類reset Test# 還原所有類reset

6.Advice

無論是匹配表達式也好、觀察表達式也罷,他們核心判斷變量都是圍繞著一個 Arthas 中的通用通知對象 Advice 進行。g6c28資訊網(wǎng)——每日最新資訊28at.com

它的簡略代碼結(jié)構(gòu)如下:g6c28資訊網(wǎng)——每日最新資訊28at.com

public class Advice {    private final ClassLoader loader;    private final Class<?> clazz;    private final ArthasMethod method;    private final Object target;    private final Object[] params;    private final Object returnObj;    private final Throwable throwExp;    private final boolean isBefore;    private final boolean isThrow;    private final boolean isReturn;    // getter/setter}

這里列一個表格來說明不同變量的含義:g6c28資訊網(wǎng)——每日最新資訊28at.com

變量名g6c28資訊網(wǎng)——每日最新資訊28at.com

變量解釋g6c28資訊網(wǎng)——每日最新資訊28at.com

loaderg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用類所在的 ClassLoaderg6c28資訊網(wǎng)——每日最新資訊28at.com

clazzg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用類的 Class 引用g6c28資訊網(wǎng)——每日最新資訊28at.com

methodg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用方法反射引用g6c28資訊網(wǎng)——每日最新資訊28at.com

targetg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用類的實例g6c28資訊網(wǎng)——每日最新資訊28at.com

paramsg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用參數(shù)列表,這是一個數(shù)組,如果方法是無參方法則為空數(shù)組g6c28資訊網(wǎng)——每日最新資訊28at.com

returnObjg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用返回的對象。當(dāng)且僅當(dāng) isReturn==true 成立時候有效,表明方法調(diào)用是以正常返回的方式結(jié)束。如果當(dāng)前方法無返回值 void,則值為 nullg6c28資訊網(wǎng)——每日最新資訊28at.com

throwExpg6c28資訊網(wǎng)——每日最新資訊28at.com

本次調(diào)用拋出的異常。當(dāng)且僅當(dāng) isThrow==true 成立時有效,表明方法調(diào)用是以拋出異常的方式結(jié)束。g6c28資訊網(wǎng)——每日最新資訊28at.com

isBeforeg6c28資訊網(wǎng)——每日最新資訊28at.com

輔助判斷標(biāo)記,當(dāng)前的通知節(jié)點有可能是在方法一開始就通知,此時 isBefore==true 成立,同時 isThrow==false 和 isReturn==false,因為在方法剛開始時,還無法確定方法調(diào)用將會如何結(jié)束。g6c28資訊網(wǎng)——每日最新資訊28at.com

isThrowg6c28資訊網(wǎng)——每日最新資訊28at.com

輔助判斷標(biāo)記,當(dāng)前的方法調(diào)用以拋異常的形式結(jié)束。g6c28資訊網(wǎng)——每日最新資訊28at.com

isReturng6c28資訊網(wǎng)——每日最新資訊28at.com

輔助判斷標(biāo)記,當(dāng)前的方法調(diào)用以正常返回的形式結(jié)束。g6c28資訊網(wǎng)——每日最新資訊28at.com

所有變量都可以在表達式中直接使用,如果在表達式中編寫了不符合 OGNL 腳本語法或者引入了不在表格中的變量,則退出命令的執(zhí)行。g6c28資訊網(wǎng)——每日最新資訊28at.com

用戶可以根據(jù)當(dāng)前的異常信息修正 條件表達式 或 觀察表達式。g6c28資訊網(wǎng)——每日最新資訊28at.com

7.快捷鍵

# 自動補全,命令后敲 - 或 -- ,然后按 tab 鍵,可以展示出此命令具體的選項Tab# 退出當(dāng)前連接Q# 后臺異步命令相關(guān)快捷鍵ctrl + c: 終止當(dāng)前命令ctrl + z: 掛起當(dāng)前命令,后續(xù)可以 bg/fg 重新支持此命令,或 kill 掉ctrl + a: 回到行首ctrl + e: 回到行尾

8.OGNL

OGNL(Object-Graph Navigation Language)是一種表達式語言(EL),簡單來說就是一種簡化了的Java屬性的取值語言,Arthas使用它做表達式過濾。g6c28資訊網(wǎng)——每日最新資訊28at.com

OGNL 表達式官網(wǎng):https://commons.apache.org/dormant/commons-ognl/language-guide.htmg6c28資訊網(wǎng)——每日最新資訊28at.com

變量引用

OGNL支持用變量來保存中間結(jié)果,并在后面的代碼中再次引用它。g6c28資訊網(wǎng)——每日最新資訊28at.com

OGNL中的所有變量,對整個表達式都是全局可見的,引用變量的方法是在變量名之前加上 # 號,OGNL會將當(dāng)前對象保存在 "this" 變量中,這個變量也可以像其他任何變量一樣引用,用 #this 表示當(dāng)前對象。g6c28資訊網(wǎng)——每日最新資訊28at.com

這里列舉一些常用的語法:g6c28資訊網(wǎng)——每日最新資訊28at.com

# 調(diào)用靜態(tài)屬性'@全路徑類目@靜態(tài)屬性名'# 調(diào)用靜態(tài)方法'@全路徑類目@靜態(tài)方法名("參數(shù)")'# 過濾,判斷,篩選'params[0]':查看第一個參數(shù)'params[0].size()':查看第一個參數(shù)的size'params[0]=="xyz"':判斷字符串相等'params[0]==123456789L':判斷l(xiāng)ong型'params[0].{ #this.name }':將結(jié)果按name屬性映射'params[0].{? #this.name == null }':按條件過濾'params[0].{? #this.age > 10 }.size()':過濾后統(tǒng)計'params[0].{^ #this.name != null}':選擇第一個滿足條件'params[0].{$ #this.name != null}':選擇最后一個滿足條件'params[0].{? #this.age > 10 }.size().(#this > 20 ? #this - 10 : #this + 10)':子表達式求值'name in { null,"Untitled" }':這條語句判斷name是否等于null或者 Untitled# 構(gòu)造對象'#{ "foo" : "foo value", "bar" : "bar value" }':構(gòu)造map參數(shù)'#@java.util.LinkedHashMap@{ "foo" : "foo value", "bar" : "bar value" }':構(gòu)造特定類型map'new com.Test("xiaoming",18)':構(gòu)造方法,new 全路徑類名()'new int[] { 1, 2, 3 }':創(chuàng)建數(shù)組并初始化# 訪問對象'@com.Test@getPerson("xiaoming",18).name':訪問復(fù)雜對象屬性,用 .屬性名 訪問屬性'@com.Test@getChilds({"xiaoming"})[0]':訪問List或者數(shù)組類型,用 [索引] 訪問'@com.Test@getMap()["xiaoming"]': 訪問Map對象,用 ["key"],key要用雙引號# 臨時變量'#value1=@com.Test@getPerson("xiaoming",18), #value2=@com.Test@setPerson(#value1) ,{#value1,#value2}': 方法A的返回值當(dāng)做方法B的入?yún)?#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}':執(zhí)行多行表達式,賦值給臨時變量,返回一個List'#obj=new com.User("xiaoming",18),@com.Test@inputObj(#obj)':先用構(gòu)造函數(shù)構(gòu)造一個對象,然后把這個對象當(dāng)做入?yún)魅?/code>

9.實用功能

(1) 管道

Arthas 命令后可接 grep  進行進一步篩選或操作,比如:g6c28資訊網(wǎng)——每日最新資訊28at.com

classloader -a | grep "String"

(2) 后臺異步執(zhí)行

當(dāng)需要排查一個問題,但是這個問題的出現(xiàn)時間不能確定,那我們就可以把檢測命令掛在后臺運行,并將保存到輸出日志。g6c28資訊網(wǎng)——每日最新資訊28at.com

# 比如希望執(zhí)行后臺執(zhí)行 trace 命令,那么調(diào)用下面命令trace Test t &# 如果希望查看當(dāng)前有哪些 arthas 任務(wù)在執(zhí)行,可以執(zhí)行 jobs 命令jobs# 可通過 > 或者 >> 將任務(wù)輸出結(jié)果輸出到指定的文件中,可以和 & 一起使用,實現(xiàn) arthas 命令的后臺異步任務(wù)。比如:trace Test t >> test.out &#異步執(zhí)行的命令,如果希望停止,可執(zhí)行kill命令kill <job-id># 當(dāng)任務(wù)正在前臺執(zhí)行,可以執(zhí)行 ‘ctrl + z’ 將任務(wù)暫停。通過jbos查看任務(wù)狀態(tài)將會變?yōu)?Stopped,再通過bg <job-id>或者fg <job-id>可讓任務(wù)重新開始執(zhí)行# 可以把對應(yīng)的任務(wù)轉(zhuǎn)到前臺繼續(xù)執(zhí)行。在前臺執(zhí)行時,無法在 console 中執(zhí)行其他命令fg <job-id># 可以把對應(yīng)的任務(wù)在后臺繼續(xù)執(zhí)行bg <job-id>

10.實用技巧

#  獲取接口的響應(yīng)時間watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+" "+ #cost}'  -n 5  -x 3 '#cost>100'  -f# 獲取指定header 頭的信息,比如這里 獲取 trace-id watch org.springframework.web.servlet.DispatcherServlet doService '{params[0].getRequestURI()+"  header="+params[1].getHeaders("trace-id")}'  -n 10  -x 3 -f # 查看執(zhí)行的SQL,下面兩個都可以watch java.sql.Connection prepareStatement '{params,throwExp}'  -n 5  -x 3 watch org.apache.ibatis.mapping.BoundSql getSql '{params,returnObj,throwExp}'  -n 5  -x 3 # 調(diào)用任意bean中的方法# 1.先獲取 classLoaderHashsc -d com.alibaba.dubbo.config.spring.extension.SpringExtensionFactor# 2.ognl 調(diào)用對應(yīng) bean 的方法,把 34f5090e 替換為對于的 classLoaderHashognl  -c 34f5090e '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next,#context.getBean("userServiceImpl").find("小明")'# 當(dāng)傳參是復(fù)雜對象時ognl -c 34f5090e '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next,#data=new Children(), #query=new User(),#query.setChildren(#data),#query.setRequestId("1"), #data.setName("小明"),#context.getBean("userServiceImpl").find(#query)'# vmtool 命令提供了更簡單的語法,也可以調(diào)用任意bean中的方法vmtool --action getInstances  --className org.springframework.context.ApplicationContext --express 'instances[0].getBean("userServiceImpl").find("小明")'# 動態(tài)修改 bean 屬性值# 本質(zhì)原理就是先獲取 bean 實例,通過反射去修改對應(yīng)屬性值ognl -c 34f5090e org.ClassLoader'#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, #instence=#context.getBean("userServiceImpl"),#fieldObj=@com.User@class.getDeclaredField("age"),#fieldObj.setAccessible(true), #fieldObj.set(#instence,18)'# 除了 ognl 也可以通過 vmtool 去獲取 beanvmtool --action getInstances  --className org.springframework.context.ApplicationContext --express 'instances[0].getBean("userServiceImpl")'

Arthas 的強大之處確實令人驚嘆!本文希望能夠啟發(fā)您去探索更多關(guān)于 Arthas 的用法和功能,相信它會為您的開發(fā)工作帶來很大的幫助和便利。g6c28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-66539-0.html實戰(zhàn)Arthas:常見命令與優(yōu)秀實踐

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: fsx 簡介:適用于 JavaScript 的現(xiàn)代文件系統(tǒng) API

下一篇: C++實現(xiàn)二叉樹:構(gòu)建、遍歷與應(yīng)用

標(biāo)簽:
  • 熱門焦點
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發(fā)布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發(fā)布結(jié)束的第一時間給大家?guī)磉@款耳機的簡單分享。現(xiàn)在大家能見到最多的藍牙耳機
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經(jīng)過去,最明顯的肯定就是大內(nèi)存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進和創(chuàng)新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態(tài)系統(tǒng),可以幫助開發(fā)人員更快地實現(xiàn)復(fù)雜的應(yīng)用。本文就來看看 Node.js 最新的生
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 一個注解實現(xiàn)接口冪等,這樣才優(yōu)雅!

    場景碼猿慢病云管理系統(tǒng)中其實高并發(fā)的場景不是很多,沒有必要每個接口都去考慮并發(fā)高的場景,比如添加住院患者的這個接口,具體的業(yè)務(wù)代碼就不貼了,業(yè)務(wù)偽代碼如下:圖片上述代碼有
  • 為什么你不應(yīng)該使用Div作為可點擊元素

    按鈕是為任何網(wǎng)絡(luò)應(yīng)用程序提供交互性的最常見方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內(nèi)置瀏覽器的功能。
  • 機構(gòu)稱Q2國內(nèi)智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場調(diào)查機構(gòu)Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創(chuàng)新自2014年以來第2季度銷量新低。報
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網(wǎng)消息,據(jù)彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產(chǎn)品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 上海舉辦人工智能大會活動,建設(shè)人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術(shù)、新產(chǎn)品、新應(yīng)用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發(fā)展盛典人工
Top 主站蜘蛛池模板: 常宁市| 浑源县| 个旧市| 安义县| 汉阴县| 张家港市| 大同县| 昌图县| 日土县| 庆云县| 西青区| 仙游县| 天祝| 绥江县| 铜鼓县| 浙江省| 高阳县| 武穴市| 天气| 石泉县| 浦县| 山阳县| 德昌县| 明光市| 丰原市| 扶绥县| 宁陕县| 怀远县| 黔东| 水富县| 沁源县| 山丹县| 九龙城区| 囊谦县| 台湾省| 阆中市| 涿鹿县| 敦化市| 邵阳县| 板桥市| 古丈县|