**一、入門程序
1. 安裝**
上述號召會下載發動劇本文件 as.sh 到當前目次:
“`
curl -L salibaba.github.ioarthasinstall.sh |運彩場中投注 sh
“`
or
as.sh 發動:
“`
curl -sk sarthas.gitee.ioarthas-boot.jar -o ~.arthas-boot.jar echo “alias as.sh=’java -jar ~.arthas-boot.jar –repo-mirror aliyun –use-‘” ~.bashrc source ~.bashrc
“`
2. 在線教程體會**
當然也可以個人當地體會一下~個人通過下載一個 arthas-ea-plugin 的體會 demo 直接當地上手。
“`
github.WangJi92ar…
“`
**全局號召說明**
– -x 是呈現結局屬性遍歷深度,默以為 1
– -n 是執行的次數 ,q 退出
– -c classloader 的hash值
– 退出 q ,關閉 stop
3. 了解最常用的trace、atch的性能**
atch和trace 是arthas 診斷中對于開闢人員解決線上的疑問最常用的性能!
trace
根本示例**
“`
trace .angji92.arthas.plugin.demo.controller.CommonController getRandomInteger -n 5 ‘1==1’
“`
– 功能優化~
– 調用的這個想法,走的具體流程是咋樣的!可以通過調用鏈看出來。
– 有反常了可以察看反常的堆棧。
**高等的性能**
trace號召只會trace匹配到的函數里的子調用,并不會向下trace多層。由於trace是價值對照貴的,多層trace可能會導致終極要trace的類和函數極度多。
“`
trace -E xxxClassA|xxxClassB method1 | method2
trace -E .angji92.arthas.plugin.demo.controller.CommonController|.angji92.arthas.plugin.demo.service.ArthasTestService traceE|doTraceE -n 5 ‘1==1’
“`
atch**
athc 從字面上懂得即是觀測值的信息,可以察看入參、回去值、反常、可以執行表白式獲取靜態變量、target.xxx調用目的實施的字段、想法等等都行~只要你想得到沒有做不到的~
**根本示例**
“`
atch .angji92.arthas.plugin.demo.controller.CommonController traceE ‘{params,returnObj,throExp}’ -n 5 -x 3 ‘1==1’
“`
4、arthas 表白式核心變量**
“`
public cla體育 投注ss 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 Throable throExp;
private final boolean isBefore;
private final boolean isThro;
private final boolean isReturn;
gettersetter
}
“`
從atch 和 trace 中看到 后面的 ‘1==1’ 執行的是一個前提表白式 當值為true 的運動 分析時候通過執行了一個ognl 表白式 ,atch 觀測 params,returnObj,throExp 入參、回去值、是否反常 這個也是一個表白式,那麼這個究竟是咋回事?
**spring el 表白式**
沒有吸取過ognl 採用長年的spring 一定知道他的el 表白式,el 表白式中也有一種概念叫做Context 高下文,和表白式 如下所示,由於有了simple這個高下文 才幹分析 “booleanList” 這個劇本的寓意~ 這個很認識,很好懂得,那麼ognl 表白式一樣不難了。
“`
class Simple {
public List booleanList = ne ArrayList();
}
Simple simple = ne Simple();
simple.booleanList.add(true);
StandardEvaluationContext simpleContext = ne StandardEvaluationContext(simple);
false is passed in here as a string. SpEL and the conversion service ill
correctly recognize that it needs to be a Boolean and convert it
parser.parseExpression(“booleanList”).setValue(simpleContext, “false”);
b ill be false
Boolean b = simple.booleanList.get(0);
“`
ognl 表白式**
arthas 也是一樣的,只是採用了一個叫做ognl的劇本,核心變量即是他的高下文,可以直接獲取到這些字段。atch 觀測的這幾個字段 params,returnObj,throExp 也即是我們所謂的高下文的概念,觀測參數、回去值、和反常的信息。
如下是arthas 源碼中 表白式考核和atch 觀測值執行的代碼!Advice 即是一個高下文,這里還提升了一個變量 const。知道了這些那不是很簡樸??
“`
.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter#isConditionMet
判斷前提是否知足,知足的場合下需求輸出結局
* param conditionExpress 前提表白式
* param advice 當前的advice對象
* param cost 本次執行的耗時
* return true 假如前提表白式知足
*
protected boolean isConditionMet(String conditionExpress, Advice advice, double cost) thros ExpressException {
return StringUtils.isEmpty(conditionExpress) ||
ExpressFactory.threadLocalExpress(advice).bind(Constants.COST_VARIABLE, cost).is(conditionExpress);
}
protected Object getExpressionResult(String express, Advice advice, double cost) thros ExpressException {
return ExpressFactory.threadLocalExpress(advice)
.bind(Constants.C日本美國賠率OST_VARIABLE, cost).get(express);
}
“`
表白式實踐
arthas 群常常有人問重載想法如何判斷,無非即是考核前提? 參數的個數、第一個參數是什麼?回去值的類型等等都可以作為你考核的前提。如下的atch 前面的一段是觀測的值、后面這一段是表白式考核 ,知足了前提才執行。
入參長度大于0
“`
atch .angji92.arthas.plugin.demo.controller.CommonController traceE ‘{params,returnObj,throExp}’ -n 5 -x 3 ‘params.length 0’
“`
回去值為String 且長度大于5
“`
atch .angji92.arthas.plugin.demo.controller.CommonController traceE ‘{params,returnObj,throExp}’ -n 5 -x 3 ‘returnObj instanceof java.lang.String returnObj.length5’
“`
前提表白式+異步工作
– 只有特定的配景才會有bug ,如何排查bug?
– 一天只顯露一兩次如何解決?
前提表白式重要是用來過濾採用,例如某些配景只是在特定的參數才會顯露,肯能會消費許多的時間去等到,這個時候可以採用前提表白式過濾 +異步工作
**5、ognl 表白式**
arthas.gitee.ioognl1. 從上面看,ognl 在atch、trace上面無所不可啊,實在還有tt 也是 採用ognl 表白式執行邏輯的。
xxxClasxxxStaticField 是靜態變量的語法糖 ognl的,好漂亮一下官方的文檔。
靜態變量由于 一個jvm 中可能被多個classloader加載,jvm 認定為一個實例是一個classloader加載哦,所以需求知道當前靜態類的has運彩 單場 過關 過關組合h 值(sc -d .angji92.arthas.plugin.demo.controller.StaticTest)可以通過這個號召獲取。
“`
ognl -x 3 ‘.angji92.arthas.plugin.demo.controller.StaticTestINVOKE_STATIC_DOUBLE’ -c e374b99
“`
**調用spring 想法?**
atch 執行ognl 語法中獲取spring context 然后進行調用bean的想法
“`
atch -x 3 -n 1 org.springframeork.eb.servlet.DispatcherServlet doDispatch ‘org.springframeork.eb.context.support.WebApplicationContextUtilsgetWebApplicationContext(params.getServletContext()).getBean(“monController”).getRandomInteger()’
“`
ognl 執行靜態的一個spring context 然后調用bean 的想法
“`
ognl -x 3 ‘#springContext=.angji92.arthas.plugin.demo.mon.ApplicationContextProvercontext,#springContext.getBean(“monController”).getRandomInteger()’ -c e374b99
“`
有沒有起飛的感到,無所不可!條件是你要把握一些ognl的一些簡樸的語法!
**6、完畢**
對于線上排探問題,我感到這幾個號召夠你用了,還有一些其他的反編譯、火焰圖、.. 時間地道、logger 品級改動,jvm環境信息等等感到是有頻率都沒有上面的高,終究jvm信息有專門的監控~縱然沒有arthas 你也可以找到更好的器具去解析堆棧,jvm故障。
完了?
啊?這麼多號召 記不住啊 還有一些高等的ognl的語法涼了… 讓你獲取一下所有的spring的環境變量咋辦?trace、atch 這兩個號召我還沒有體會夠呢?加倍高等的讓我如何是好啊!好了,請看下文。
二、進階**
**條件**
條件是你對于arthas 有了大約的懂得,根本上的號召都有點概念了,ognl 簡樸的語法或許看懂了.. 簡樸的前提表白式會用了。 之前我們所過arthas的號召這麼多 要銘記小本本少不了啊!不適想哭~ 不要急,汪小哥來給你解決疑問!
目前Arthas 官方的器具還不夠充足的簡樸,需求銘記一些號召,獨特是一些開拓性獨特強的高等語法,例如ognl獲取spring context 為所欲為,atch、trace 不夠簡樸,需求組成一些號召器具的信息,因此只需求一個或許簡樸處置字符串信息的插件即可採用。當在處置線上疑問的時候需求最快速、最方便的號召,因此arthas ea 插件還是有存在的意義和代價的。
arthas ea plugin**
這個插件的意義不是處置協議層面的疑問,重要解決號召生成的疑問,由于工程在ea 里面控制,你想想你要atch 哪個類,這個插件是知道的,協助你更便捷、加倍快捷的構建號召。採用arthas ea 插件 這一點一定要懂得哦!重要解決你如何組成號召的疑問! 更多察看文檔
**解決的疑問**
– spring 環境變量優先級疑問
– 獲取靜態變量
– 火焰圖集成
– logger 號召集成
– 反編譯集成
– trace -E 集成
– tt 集成
……. 根本上你或許在arths 上面看到的性能都集成到了這個上面!直接在ea 里面搜索arths ea 即可安裝。
**常用不同凡響服法疑問
*靜態變量**
可以直接獲取 ognl 獲取
“`
ognl -x 3 ‘.angji92.arthas.plugin.demo.controller.StaticTestINVOKE_STATIC_DOUBLE’ -c e374b99
“`
可以通過atch 獲取 (光標放置在字段上)
“`
atch .angji92.arthas.plugin.demo.controller.StaticTest * ‘{params,returnObj,throExp,.angji92.arthas.plugin.demo.controller.StaticTestINVOKE_STATIC_DOUBLE}’ -n 5 -x 3 ‘1==1’
“`
**通常的變量**
可以通過spring context.getBean().field 獲取(這個是要部署一個靜態的spring context 看採用文檔)
tt 、atch 也是可以的哦~ 一樣的原則
“`
ognl -x 3 ‘#springContext=.angji92.arthas.plugin.demo.mon.ApplicationContextProvercontext,#springContext.getBean(“staticTest”).filedValue’ -c e374b99
“`
atch 獲取 放置在字段上即可
“`
atch .angji92.arthas.plugin.demo.controller.StaticTest * ‘{params,returnObj,throExp,target.filedValue}’ -n 5 -x 3 ‘method.initMethod(),method.constructor!=null || !java.lang.reflect.ModifierisStatic(method.method.getModifiers())’
“`
抉擇的部署項的值
“`
springContext.getEnvironment() (這個是要部署一個靜態的spring context 看採用文檔)
ognl -x 3 ‘#springContext=.angji92.arthas.plugin.demo.mon.ApplicationContextProvercontext,#springContext.getEnvironment().getProperty(“custom.name”)’ -c e374b99
“`
獲取所有的部署項的值
atch 獲取spring context tt 、static 也是可以的哦~ 一樣的原則
“`
atch -x 3 -n 1 org.springframeork.eb.servlet.DispatcherServlet doDispatch ‘#springContext=org.springframeork.eb.context.support.WebApplicationContextUtilsgetWebApplicationContext(params.getServletContext()),#allProperties={},#standardServletEnvironment=#propertySourceIterator=#springContext.getEnvironment(),#propertySourceIterator=#standardServletEnvironment.getPropertySources().iterator(),#propertySourceIterator.{#key=#this.getName(),#allProperties.add(” “),#allProperties.add(“————————- name”+#key),#this.getSource() instanceof java.util.Map ?#this.getSource().entrySet().iterator.{#key=#this.key,#allProperties.add(#key+”=”+#standardServletEnvironment.getProperty(#key))}#{}},#allProperties’
“`