一、監(jiān)控相關(guān)命令介紹
二、監(jiān)控相關(guān)命令
2.1、運(yùn)行Demo
2.2、monitor 命令
2.2.1、方法監(jiān)控
2.3、watch 命令 (重要)
2.3.1、觀察函數(shù)調(diào)用返回時(shí)的參數(shù)、this 對(duì)象和返回值
2.3.2、查看函數(shù)調(diào)用的入?yún)⒑头祷刂?/p>
2.3.3、深度遍歷 x 說明
2.3.4、查看方法調(diào)用前和函數(shù)返回后的值
2.4、trace 命令(重要)
2.4.1、查看方法耗時(shí)情況
2.4.2、據(jù)調(diào)用耗時(shí)過濾(重要)
2.4.3、包含 JDK 函數(shù)
2.4.4、trace 多個(gè)類或者多個(gè)函數(shù)
2.5、stack?命令(重要)
2.5.1、查看方法被調(diào)用的調(diào)用情況
2.5.2、根據(jù)條件表達(dá)式來過濾
一、監(jiān)控相關(guān)命令介紹
????????stack、trace、watch 線上使用比較多,本篇會(huì)詳細(xì)介紹這幾個(gè)命令。
命令 | 說明 |
---|---|
monitor | 方法執(zhí)行監(jiān)控 |
stack | 輸出當(dāng)前方法被調(diào)用的調(diào)用路徑 |
trace | 方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí) |
watch | 方法執(zhí)行數(shù)據(jù)觀測(cè) |
這些命令,都通過字節(jié)碼增強(qiáng)技術(shù)來實(shí)現(xiàn)的,會(huì)在指定類的方法中插入一些切面來實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)和觀測(cè),因此在線上、預(yù)發(fā)使用時(shí),請(qǐng)盡量明確需要觀測(cè)的類、方法以及條件,診斷結(jié)束要執(zhí)行 stop 或?qū)⒃鰪?qiáng)過的類執(zhí)行 reset 命令。
watch/stack/trace這個(gè)三個(gè)命令都支持#cost
二、監(jiān)控相關(guān)命令
2.1、運(yùn)行Demo
????????在官方提供的?arthas(?arthas-bin.zip)程序中,提供一個(gè) math-game.jar 的 demo ,本章就通過該demo進(jìn)行演示。
????????運(yùn)行?math-game.jar
java -jar math-game.jar
????????啟動(dòng) arthas 連接到該 java 程序
????????math-game 的源代碼如下:?
https://github.com/alibaba/arthas/blob/master/math-game/src/main/java/demo/MathGame.java
public List<Integer> primeFactors(int number) {
if (number < 2) {
illegalArgumentCount++;
throw new IllegalArgumentException("number is: " + number + ", need >= 2");
}
List<Integer> result = new ArrayList<Integer>();
int i = 2;
while (i <= number) {
if (number % i == 0) {
result.add(i);
number = number / i;
i = 2;
} else {
i++;
}
}
return result;
}
2.2、monitor 命令
????????對(duì)匹配 class-pattern/method-pattern/condition-express的類、方法的調(diào)用進(jìn)行監(jiān)控。
????????monitor?命令是一個(gè)非實(shí)時(shí)返回命令,實(shí)時(shí)返回命令是輸入之后立即返回,而非實(shí)時(shí)返回的命令,則是不斷的等待目標(biāo) Java 進(jìn)程返回信息,直到用戶輸入?Ctrl+C?為止。
????????服務(wù)端是以任務(wù)的形式在后臺(tái)跑任務(wù),植入的代碼隨著任務(wù)的中止而不會(huì)被執(zhí)行,所以任務(wù)關(guān)閉后,不會(huì)對(duì)原有性能產(chǎn)生太大影響。
參數(shù):
????????方法擁有一個(gè)命名參數(shù) [c:],意思是統(tǒng)計(jì)周期(cycle of output),擁有一個(gè)整型的參數(shù)值
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern |
類名表達(dá)式匹配 |
method-pattern |
方法名表達(dá)式匹配 |
condition-express |
條件表達(dá)式 |
[E] |
開啟正則表達(dá)式匹配,默認(rèn)為通配符匹配 |
[c:] |
統(tǒng)計(jì)周期,默認(rèn)值為120秒 |
[b] |
在方法調(diào)用之前計(jì)算condition-express |
使用說明:
????????2.2.1、方法監(jiān)控
????????查看 MathGame 類中 primeFactors方法的運(yùn)行情況,默認(rèn)值為120秒輸出一次結(jié)果,可以通過 -c 指定統(tǒng)計(jì)周期,按 Q 或者 Ctrl+C 來終止。
monitor demo.MathGame primeFactors
?????????每隔 5s 統(tǒng)計(jì)一次方法運(yùn)行情況。
monitor demo.MathGame primeFactors -c 5
數(shù)據(jù)說明:
監(jiān)控項(xiàng) | 說明 |
---|---|
timestamp |
時(shí)間戳 |
class |
Java類 |
method |
方法(構(gòu)造方法、普通方法) |
total |
調(diào)用次數(shù) |
success |
成功次數(shù) |
fail |
失敗次數(shù) |
rt |
平均RT |
fail-rate |
失敗率 |
2.3、watch 命令 (重要)
????????函數(shù)執(zhí)行數(shù)據(jù)觀測(cè),讓你能方便的觀察到指定函數(shù)的調(diào)用情況。能觀察到的范圍為:返回值、拋出異常、入?yún)?,通過編寫 OGNL 表達(dá)式進(jìn)行對(duì)應(yīng)變量的查看。
參數(shù):
????????watch 的參數(shù)比較多,主要是因?yàn)樗茉?4 個(gè)不同的場(chǎng)景觀察對(duì)象 ——?函數(shù)調(diào)用之前,函數(shù)異常之后,函數(shù)返回之后,函數(shù)結(jié)束之后。
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern |
類名表達(dá)式匹配 |
method-pattern |
函數(shù)名表達(dá)式匹配 |
express |
觀察表達(dá)式,默認(rèn)值:{params, target, returnObj} |
condition-express |
條件表達(dá)式 |
[b] |
在函數(shù)調(diào)用之前觀察 |
[e] |
在函數(shù)異常之后觀察 |
[s] |
在函數(shù)返回之后觀察 |
[f] |
在函數(shù)結(jié)束之后(正常返回和異常返回)觀察 |
[E] |
開啟正則表達(dá)式匹配,默認(rèn)為通配符匹配 |
[x:] |
指定輸出結(jié)果的屬性遍歷深度,默認(rèn)為 1 |
????????觀察表達(dá)式的構(gòu)成主要由 ognl 表達(dá)式組成,所以你可以這樣寫"{params,returnObj}",只要是一個(gè)合法的 ognl 表達(dá)式,都能被正常支持。
????????OGNL 表達(dá)式官網(wǎng):
????????https://commons.apache.org/proper/commons-ognl/language-guide.html
使用說明:
? ? ? ? 2.3.1、觀察函數(shù)調(diào)用返回時(shí)的參數(shù)、this 對(duì)象和返回值
????????查看 demo.MathGame 類中 primeFactors 方法出參和返回值
watch demo.MathGame primeFactors
- 觀察表達(dá)式,默認(rèn)值是{params, target, returnObj},params 是入?yún)?,target 是 this?對(duì)象,returnObj 是返回值
- 函數(shù)被執(zhí)行了兩次,第一次結(jié)果是location=AtExit,說明函數(shù)正常返回,因此可以看到returnObj結(jié)果是一個(gè) ArrayList
- 第二次結(jié)果里是location=AtExceptionExit,說明函數(shù)拋出異常了,因此 returnObj 是 null
- ts 是時(shí)間戳,表示當(dāng)前方法執(zhí)行時(shí)間,cost 是指當(dāng)前方法耗時(shí)
- 默認(rèn)深度遍歷x=1,只顯示最外層對(duì)象屬性,入?yún)?Object 表示入?yún)⑹莻€(gè)對(duì)象,返回值為 ArrayList 表示返回是個(gè)對(duì)象數(shù)組
? ? ? ? 2.3.2、查看函數(shù)調(diào)用的入?yún)⒑头祷刂?
????????查看 demo.MathGame 類中 primeFactors 方法出參和返回值,結(jié)果屬性遍歷深度為2。
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
- 函數(shù)被執(zhí)行了兩次,第一次結(jié)果是location=AtExit,說明函數(shù)正常返回,因此可以看到returnObj結(jié)果是一個(gè) ArrayList
- 第二次結(jié)果里是location=AtExceptionExit,說明函數(shù)拋出異常了,因此returnObj是 null
- 深度遍歷x=2,不但顯示對(duì)象屬性,而且顯示對(duì)象的值,入?yún)?Object 表示入?yún)⑹莻€(gè)Integer類型的對(duì)象,對(duì)象值為1,返回值為 ArrayList 數(shù)組,值為 2,2,5,347。
? ? ? ? 2.3.3、深度遍歷 x 說明
????????在查看方法執(zhí)行信息時(shí),通過深度遍歷參數(shù) x 來查看參數(shù)和返回值顯示的信息,x 值不同,顯示的結(jié)果也不一樣。
- -x:表示遍歷深度,可以調(diào)整來打印具體的參數(shù)和結(jié)果內(nèi)容,默認(rèn)值是 1。
- -x:最大值是 4,防止展開結(jié)果占用太多內(nèi)存。用戶可以在ognl表達(dá)式里指定更具體的 field。
? ? ? ? 我們分別執(zhí)行三條命令,查看 深度遍歷 x = 1,x = 2,x = 3 的不同結(jié)果。其中 -n 表示執(zhí)行幾次結(jié)束,這里我們?cè)O(shè)置為1次。
watch demo.MathGame primeFactors -x 1 -n 1
watch demo.MathGame primeFactors -x 2 -n 1
watch demo.MathGame primeFactors -x 3 -n 1
- 如果對(duì)象里面的對(duì)象屬性越多,層級(jí)越深
????????2.3.4、查看方法調(diào)用前和函數(shù)返回后的值
????????查看 demo.MathGame 類中 primeFactors() 方法調(diào)用前和方法執(zhí)行后返回的值。
- 參數(shù)里 -n 2,表示只執(zhí)行兩次
- 這里輸出結(jié)果中,第一次輸出的是函數(shù)調(diào)用前的觀察表達(dá)式的結(jié)果,第二次輸出的是函數(shù)返回后的表達(dá)式的結(jié)果
- 結(jié)果的輸出順序和事件發(fā)生的先后順序一致,和命令中?-s -b?的順序無關(guān)
watch demo.MathGame primeFactors -b -s -n 2 -x 2
????????2.3.5、觀察當(dāng)前對(duì)象中的屬性
????????查看 demo.MathGame 類中的屬性值,遍歷深度為2。?
watch demo.MathGame primeFactors "target" -x 2
????????觀察當(dāng)前對(duì)象中的屬性
????????如果想查看函數(shù)運(yùn)行前后,當(dāng)前對(duì)象中的屬性,可以使用 target 關(guān)鍵字,target 代表this 對(duì)象。查看 demo.MathGame 類中 primeFactors()?方法運(yùn)行前的對(duì)象中屬性值,遍歷深度為2。?
watch demo.MathGame primeFactors "target" -b -x 2
? ? ? ? 使用 target.field_name 可以訪問當(dāng)前對(duì)象的某個(gè)屬性值,查看 demo.MathGame 類中 primeFactors()?方法運(yùn)行時(shí) illegalArgumentCount 屬性的值,遍歷深度為2
watch demo.MathGame primeFactors "target.illegalArgumentCount" -x 2
????????2.3.6、條件表達(dá)式
????????打印入?yún)⑿∮?的執(zhí)行執(zhí)行情況,只有滿足條件的調(diào)用,才會(huì)有響應(yīng)。使用 -v 參數(shù)打印更多信息。params[0] 時(shí)入?yún)⒌谝粋€(gè)參數(shù),params[0] < 0 表示只顯示第一個(gè)入?yún)⒅敌∮?的信息。
?????當(dāng)命令執(zhí)行之后,沒有輸出結(jié)果。有兩種可能:
- 匹配到的函數(shù)沒有被執(zhí)行
- 條件表達(dá)式結(jié)果是 false
?????但用戶區(qū)分不出是哪種情況,使用?-v選項(xiàng),則會(huì)打印Condition express的具體值和執(zhí)行結(jié)果,方便確認(rèn)。
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" -v
?????????按照方法執(zhí)行耗時(shí)進(jìn)行過濾
watch demo.MathGame primeFactors '{params, returnObj}' '#cost > 1' -x 2
#cost>1(單位是ms)表示只有當(dāng)耗時(shí)大于 1ms 時(shí)才會(huì)輸出,過濾掉執(zhí)行時(shí)間小于 1ms 的調(diào)用。
????????查看方法執(zhí)行異常時(shí)的信息
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
2.4、trace 命令(重要)
????????方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)
????????trace 命令能主動(dòng)搜索 class-pattern/method-pattern 對(duì)應(yīng)的方法調(diào)用路徑,渲染和統(tǒng)計(jì)整個(gè)調(diào)用鏈路上的所有性能開銷和追蹤調(diào)用鏈路。
????????trace 能方便的幫助你定位和發(fā)現(xiàn)因 RT 高而導(dǎo)致的性能問題缺陷,但其每次只能跟蹤一級(jí)方法的調(diào)用鏈路。
參數(shù):
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern |
類名表達(dá)式匹配 |
method-pattern |
方法名表達(dá)式匹配 |
condition-express |
條件表達(dá)式 |
[E] |
開啟正則表達(dá)式匹配,默認(rèn)為通配符匹配 |
[n:] |
命令執(zhí)行次數(shù) |
#cost |
方法執(zhí)行耗時(shí) |
使用說明:
????????2.4.1、查看方法耗時(shí)情況
????????查看?demo.MathGame 類中 run() 方法執(zhí)行耗時(shí)情況
????????使用用 -n 參數(shù)指定捕捉結(jié)果的次數(shù)。
????????2.4.2、據(jù)調(diào)用耗時(shí)過濾(重要)
????????過濾 demo.MathGame 類中 run() 方法執(zhí)行耗時(shí)情況,'#cost > 1' 表示只顯示方法執(zhí)行耗時(shí)大于 1ms 的執(zhí)行情況,根據(jù)耗時(shí)進(jìn)行過濾,有助于在排查問題的時(shí)候,只關(guān)注異常情況。
trace demo.MathGame run '#cost > 1'
????????2.4.3、包含 JDK 函數(shù)
????????trace 包含 jdk 里的函數(shù)調(diào)用情況
trace --skipJDKMethod false demo.MathGame run
????????默認(rèn)情況下,trace 不會(huì)包含 jdk 里的函數(shù)調(diào)用,如果希望 trace jdk 里的函數(shù),需要顯式設(shè)置--skipJDKMethod false。?
????????2.4.4、trace 多個(gè)類或者多個(gè)函數(shù)
????????trace 命令只會(huì) trace 匹配到的函數(shù)里的子調(diào)用,并不會(huì)向下 trace 多層。因?yàn)?trace 是代價(jià)比較貴的,多層 trace 可能會(huì)導(dǎo)致最終要 trace 的類和函數(shù)非常多。
????????可以用正則表匹配路徑上的多個(gè)類和函數(shù),一定程度上達(dá)到多層 trace 的效果。
????????trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
trace -E demo.MathGame run|primeFactors
? ? ? ? 查看??demo.MathGame 類中,run() 方法調(diào)用鏈上 run() 和?primeFactors() 方法執(zhí)行耗時(shí)。
2.5、stack?命令(重要)
????????輸出當(dāng)前方法被調(diào)用的調(diào)用路徑
????????很多時(shí)候我們都知道一個(gè)方法被執(zhí)行,但這個(gè)方法被執(zhí)行的路徑非常多,或者你根本就不知道這個(gè)方法是從那里被執(zhí)行了,此時(shí)你需要的是 stack 命令。
參數(shù):
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern |
類名表達(dá)式匹配 |
method-pattern |
方法名表達(dá)式匹配 |
condition-express |
條件表達(dá)式 |
[E] |
開啟正則表達(dá)式匹配,默認(rèn)為通配符匹配 |
[n:] |
執(zhí)行次數(shù)限制 |
使用說明
? ? ? ? 2.5.1、查看方法被調(diào)用的調(diào)用情況
????????查看 demo.MathGame 類中 primeFactors() 方法調(diào)用情況
stack demo.MathGame primeFactors
?????????輸出結(jié)果中,demo.MathGame.primeFactors 被?demo.MathGame.run() 方法調(diào)用,demo.MathGame.run() 方法被 demo.MathGame.main() 方法調(diào)用。
????????2.5.2、根據(jù)條件表達(dá)式來過濾
????????查看 demo.MathGame 類中 primeFactors() 方法第一個(gè)入?yún)⑿∮?的調(diào)用情況
stack demo.MathGame primeFactors 'params[0] < 0' -n 2
????????根據(jù)執(zhí)行時(shí)間來過濾
????????查看 demo.MathGame 類中 primeFactors() 方法執(zhí)行耗時(shí)超過 1ms 的調(diào)用情況文章來源:http://www.zghlxwxcb.cn/news/detail-810357.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-810357.html
到了這里,關(guān)于Java 診斷利器 Arthas monitor/watch/trace命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!